私は今少し混乱しています。昨日、g ++で-rdynamicを使用しても、未定義のシンボルがありました。しかし、今はエラーがなく、それはさらに厄介です。
私の場合を少し説明するために、共有オブジェクトのようなプラグインを実行したいと思います。どちらが最善の方法かはまだ決めていません。
A)私の共有オブジェクトにはすべて、パラメーターを使用して呼び出されるレジスターと呼ばれる関数があります。これはプラグインマネージャーになります。
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のみを使用しますが、将来的にはクラスのインスタンスになります。
ケースA)での私の唯一の試みは、セグメンテーション違反でした...私は本当に何を逃したのかわかりません。
//これまでの結果(今日)
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