Linux上的链接器错误:“未定义引用”

时间:2012-09-05 00:01:05

标签: linux gcc build linker

我可以毫无问题地创建共享库。我创建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上

谢谢。

2 个答案:

答案 0 :(得分:28)

将库放在链接命令行上的目标文件之后:

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

如果不这样做,链接器可能会决定它在扫描库的链接阶段从特定库中不需要任何内容​​,然后它会在找到某些未定义的库后重新扫描库。目标文件中的符号。如果先放置目标文件,则不会遇到此问题。

答案 1 :(得分:1)

我认为它引起的找不到符号,gcc会先从左边开始,尝试把lib文件放在最后