linuxダイナミックライブラリsoは外部soを呼び出し、実行時にundefined symbolが表示されます.


このような問題が発生すると、一般的にある工事のダイナミックリンクライブラリに問題が発生し、一般的に以下の解決方法である:一、現在の工事の.soファイルと生成する.soファイルのエンジニアリングコードが一致しません.soファイルには、エンジニアリングコードの関数が含まれていません.例えば私のエンジニアリングコードにはNdarrytoImage()という関数がありますが、私は使用しています.so生成時にその関数がなければ,コンパイル時にNdarrytoimage関数を含まないとno ndarrytoimage undefined symbolが投げ出され,その関数を含むエンジニアリングコードを再コンパイルしてディレクトリにコピーすればよい.
二、まずチェックして、C++はcのライブラリを呼び出しましたか?extern「c」、特にクラスのダイナミックライブラリを追加する必要があるかどうかは、ファクトリモードを使用する必要があります.createは、ファクトリ関数にextern「c」宣言が必要です.
extern “C” CDbBase* create(); extern “C” void destroy(CDbBase* p);

CDbBase* create() {return new CDbDb2; } void destroy(CDbBase* p) {printf(“destroy CDbDb2!”);    delete p; }
三、ldd-r xxxを使用する.soまたはnm-A xxx.soなどのコマンドは、soが定義されていない記号を表示します.
四、ステップ2で定義されていない記号がたくさん発見され、実行時のundefined symbolと一致し、この記号は外部のシステムの動的ライブラリで定義されており、その目標は自分が書いた動的ライブラリに位置し、リンクの過程で、これらの動的ライブラリをリンクに入れるかどうか.
検索してmakefileがダイナミックライブラリをコンパイルしていることを発見した場合、リンク記号が見つからないのもコンパイルが許可されているので、それは制限条件を付けて、makefileに-Xlinker–unresolved-symbols=ignore-in-shared-libsを加えて、それをエラーにして、定義されていない記号をエラーにします.
五、makefileのエラーによると、外部のダイナミックライブラリを-lに入れるのを忘れ、ダイナミックライブラリパス-Lを入れればいい.