Я сейчас немного растерялся. Вчера у меня были неопределенные символы, даже если я использовал -rdynamic с g ++. Но сейчас у меня нет никаких ошибок, и это еще более тревожно.
Чтобы немного объяснить мой случай, я хочу сделать какой-нибудь плагин, например, общий объект. Я еще не решил, какой из них лучший.
A) Все мои общие объекты имеют функцию с именем 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
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();
В этом примере S :: shared - это статический объект, которым я бы поделился. Для этого простого теста я использую только int, но в будущем это будет экземпляр класса.
Моя единственная попытка в случае А) была сегфо ... Я действительно не знаю, что я пропустил.
// Результаты на сегодня (сегодня)
piplup@vika:~/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
piplup@vika:~/dev/WebDesign/Scproci$ ./main
In main -> 0
In main -> 0