gcc で共有ライブラリをコンパイルし、メインにリンクしました。メイン クラスは、共有ライブラリ内に表示されるロガー クラスを初期化する必要がありますが、共有ライブラリに独自のインスタンスがあるように見えます。
インクルード ファイルは次のようになります。
extern Log gLog;
主に宣言されています。
Log gLog(new StreamWriter());
リンクしようとするとundefined symbol _gLog
、共有ライブラリでリンカー エラーが発生します。クラスインスタンスだからかなと思ってポインタに変えてみたのですが、やはり同じです。さらに悪いことに、共有ライブラリに同じグローバル変数を作成し、それを初期化する関数を呼び出す小さなダミー モジュールを作成できると考えました。しかし、この関数では、メインに表示されないため、リンカ エラーも発生します。
共有ライブラリで:
Log *gLogger;
int initLibrary(Log *pLogger)
{
gLogger = pLogger;
}
そして主に:
Log gLog(new StreamWriter());
int initLibrary(Log *pLogger);
main()
{
initLibrary(&gLog);
}
ここでも、リンカーで未定義のシンボルを取得します。今回は initLibrary 関数です。
今のところ、機能するダミー クラスを作成して問題を解決します。ただし、私の理解が間違っているように見えるため、共有ライブラリの境界を越えてシンボルを適切に定義する方法を知りたいです。
Google を使用しているときに、ここでいくつかのスレッドを見つけました。例として、共有ライブラリでグローバル変数を使用し、グローバル変数、共有ライブラリ、および -fPIC 効果を使用します (この問題には他にもいくつかあります)。ただし-fpic
、メインモジュールも含めてすべてを再コンパイルしようとしましたが、まだ機能しません。オプションは不明なので、-rdynamic
これがどこから来たのかわかりません。
共有ライブラリのクラスを使用でき、その逆も可能であるため、これはグローバル シンボルにのみ影響します。メインコードと共有ライブラリがシンボルを相互に認識できないというのは、何が間違っているのでしょうか?