2016-11-29 23 views
1

これを単純にしておきます。A.lib、libB.so(A.libを使用)、C.exe(libBを使用します。そう)。注:これはLinuxであり、Windowsではありません。私はバイナリタイプ/目的を伝えるために.exeを使用しています。g ++の.soとリンクすると、未定義の参照が返されます。

私は単なるテストプログラムなので、コマンドプロンプトからC.exeをコンパイルしてリンクしようとしています。これは私が使用している行です:

g++ -I../include C.cpp -o C.exe -L../lib -lB 

結果は、A.libにあるものへの多くの未定義の参照です。 libB.soからエクスポートされたものを参照するエラーはありません。

私はその同じディレクトリにlibB.soをコピーして、このコマンドを使用する場合:

g++ -I../include C.cpp -o C.exe -lB 

結果はC.exeが構築され、エラーなしで実行することが可能です。

libB.soがビルドされると、ビルドに使用されたlibsは必要ありません。それにもかかわらず、私は最終的な試みとして何かを試みると思った。 A.libをlibB.soと同じlibディレクトリにコピーし、元のbuildコマンドをもう一度試しました。結果は同じでした。

すべてのご意見をいただきました。

+0

'libB.so'はどうやってリンクしましたか?明示的に 'A.lib'とリンクしましたか? –

+0

'-L'に加えて、' -R'オプションを使います。詳細は 'ld'のmanページを参照してください。 –

+0

ちなみに、 'A'ライブラリは静的*ライブラリか*動的*ライブラリですか? –

答えて

0

SamVershavchikが答えの道に私を置きました。私はこのコマンドを最初に試しました:

結果はクリーンなビルドでしたが、C.exeを実行したときにシンボルが見つからないという別のエラーが発生しました。

私は、次のコマンドを修正:

g++ -I../include C.cpp -o C.exe -Wl,-R,--just-symbols=../lib/libB.so -lB 

これは、クリーンビルドエラーなしC.exeを実行する機能が生じました。

関連する問題