저는 지금 약간 혼란 스럽습니다. 어제 나는 g ++로 -rdynamic을 사용 했더라도 정의되지 않은 기호를 가지고있었습니다. 하지만 지금은 아무런 오류가 없으며 그것은 더욱 혼란 스럽습니다.공유 객체의 앱 객체 사용
제 경우를 설명하기 위해 공유 객체와 같은 일종의 플러그인을 만들고 싶습니다. 나는 아직 최선의 방법을 결정하지 않았습니다.
가) 내 공유 객체에는 모두 매개 변수로 호출되는 register라는 함수가 있습니다. 이것은 플러그인 관리자가 될 것입니다.
B) 내 공유 객체가 클래스를 정의하고로드 할 때 해당 클래스의 인스턴스를 만들고 인스턴스화합니다. 해당 클래스의 생성자에서는 응용 프로그램에서 정적 싱글 톤을 가져오고 자동 등록을 시도합니다.
내 첫 시도가 지금까지 그렇게 좋지 않았다고 말할 수있는 한.
MAIN.CPP
#include "main.hpp"
#include <iostream>
#include <cstdio>
#include <dlfcn.h>
int S::shared = 0;
int main(int argc, char** argv){
std::cout << "In main -> " << S::shared << "\n";
void* triangle = dlopen("./libtwo.so", RTLD_LAZY);
if(triangle == NULL){
std::cout << "Error while loading so file\n" << dlerror() << "\n";
}
std::cout << "In main -> " << S::shared << "\n" << triangle;
return 0;
}
main.hpp 그 샘플 S :: 공유에서
class S {
public:
static int shared;
S(){
S::shared = 0;
};
};
two.cpp
#include "main.hpp"
#include <iostream>
class MyObject {
public:
MyObject(){
std::cout << "In two -> " << S::shared << "\n";
}
};
MyObject t();
내가 공유 할 정적 객체입니다. 이 간단한 테스트에서는 int 만 사용하지만, futur에서는 클래스의 인스턴스가됩니다.
케이스 A)에 대한 나의 유일한 시도는 세그 폴트 (segfault)였습니다 ... 나는 내가 무엇을 놓쳤는 지 정말로 알지 못합니다.
// 결과 지금까지 (오늘)
[email protected]:~/dev/WebDesign/Scproci$ scons -Q
g++ -o two.os -c -fPIC two.cpp
g++ -o libtwo.so -shared two.os
g++ -o main.o -c -fPIC main.cpp
g++ -o main -Wl,--export-dynamic main.o -ldl
[email protected]:~/dev/WebDesign/Scproci$ ./main
In main -> 0
In main -> 0
두 번째 방법에 대한 코드 만 표시하고 표시되는 내용에 따라 예상대로 작동하는 것으로 가정하십시오. – diverscuba23
왜 "In two -> 0"이 표시되지 않습니까? –
정의되지 않은 기호는 S :: shared가 main.cpp에 정의되어 있기 때문에 발생하지만 libtwo.so를 연결할 때 정의 된 main.o를 포함하지 않았습니다. – Flame