Linux上的链接器错误:";未定义的引用;

Linux上的链接器错误:";未定义的引用;,linux,gcc,build,linker,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_Bi

我能够毫无问题地创建一个共享库。我创建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


谢谢。

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

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

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

我想这是因为找不到符号,gcc会先从左边穿过,试着把lib文件放在末尾。

你确定要把
/media/sf\u BitEagle\u Projects/cbitcoin/build/bin
路径硬连接到你的可执行文件中吗?这里我只是链接一个测试。它是为了测试库而设计的,所以只要它在构建后还能正常工作就无所谓了;没关系。可能的副本也解决了我的问题。这是一个多么可怕的错误/设计决策(使选项相对于位置参数的顺序变得重要)传统上,选项排在第一位,其他参数紧随其后。
-L
选项可以在命令行上的任意位置,但是您需要将
-l name
选项视为指定在命令行中的该点处处理的文件(因此任何相关的
-l
标志都应该在其前面)。因此,从(Unix)时代开始——至少是在20世纪70年代的某个时候——就一直如此。看来,
-l
选项之间的相对顺序也很重要,更一般的/较低级别的依赖关系应该排在最后,而不是第一位。我得到了对“pow”的
未定义引用
,直到我将
-lm
移动到选项字符串的最末端。