web-dev-qa-db-ja.com

Linuxでのリンカーエラー:「未定義の参照」

問題なく共有ライブラリを作成できます。私はlibcbitcoin.so(エラーなし)を作成し、それを実行可能ファイルとOpenSSLライブラリーでリンクしようとします。私はこのコマンドを使用します:

gcc -L/media/sf_BitEagle_Projects/cbitcoin/build/bin -lcbitcoin \
-Wl-rpath,/media/sf_BitEagle_Projects/cbitcoin/build/bin -lssl -lcrypto \
-L/usr/local/ssl/lib/ -o /media/sf_BitEagle_Projects/cbitcoin/build/bin/testCBAddress \
/media/sf_BitEagle_Projects/cbitcoin/build/obj/testCBAddress.o \
/media/sf_BitEagle_Projects/cbitcoin/build/obj/CBOpenSSLCrypto.o

Binディレクトリは、ライブラリの場所です。 objディレクトリには、実行可能ファイルにリンクするオブジェクトファイルがあります。コマンドでは、-L、-l、-rpathオプションを使用しています。これらは、Linuxでリンクするために必要なすべてのオプションだと思っていました。次のようなエラーが発生するので、私は間違っているようです:

/media/sf_BitEagle_Projects/cbitcoin/test/testCBAddress.c:40:
undefined reference to `CBNewByteArrayFromString'

CBNewByteArrayFromStringがライブラリにあります。何らかの理由でリンクされていません。 OpenSSLも:

/media/sf_BitEagle_Projects/cbitcoin/dependencies/crypto/CBOpenSSLCrypto.c:37:
undefined reference to `SHA1'

リンクを機能させるにはどうすればよいですか?

GCCバージョン:gcc(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3

Linux Mint 13の場合

ありがとうございました。

14

リンクコマンドラインでオブジェクトファイルの後にライブラリを配置します。

gcc /media/sf_BitEagle_Projects/cbitcoin/build/obj/testCBAddress.o \
    /media/sf_BitEagle_Projects/cbitcoin/build/obj/CBOpenSSLCrypto.o \
    -L/media/sf_BitEagle_Projects/cbitcoin/build/bin \
    -lcbitcoin -Wl-rpath,/media/sf_BitEagle_Projects/cbitcoin/build/bin \
    -L/usr/local/ssl/lib/ -lssl -lcrypto \
    -o /media/sf_BitEagle_Projects/cbitcoin/build/bin/testCBAddress

これを行わないと、リンカーは、ライブラリをスキャンするリンクの段階で特定のライブラリから何も必要ないと判断し、その後、未定義のシンボルが見つかった後、ライブラリを再スキャンしません。オブジェクトファイル。オブジェクトファイルを最初に配置した場合、この問題は発生しません。

29

私はそれがシンボルを見つけることができないことが原因だと思います、gccは最初に左から通過します、最後にlibファイルを入れてみてください

1
How Chen