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

Mat*_*ell 13 linux linker gcc build

我可以毫无问题地创建一个共享库.我创建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
Run Code Online (Sandbox Code Playgroud)

bin目录是库的位置.obj目录包含我希望链接到可执行文件的目标文件.在命令中我使用-L,-l和-rpath选项,我认为这些选项只需要在linux中进行链接.看来我错了,因为我得到的错误如下:

/media/sf_BitEagle_Projects/cbitcoin/test/testCBAddress.c:40:
undefined reference to `CBNewByteArrayFromString'
Run Code Online (Sandbox Code Playgroud)

CBNewByteArrayFromString可在库中找到.由于某种原因,它没有被联系起来.OpenSSL也是:

/media/sf_BitEagle_Projects/cbitcoin/dependencies/crypto/CBOpenSSLCrypto.c:37:
undefined reference to `SHA1'
Run Code Online (Sandbox Code Playgroud)

如何使链接起作用?

GCC版本:gcc(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3

在Linux Mint 13上

谢谢.

Jon*_*ler 29

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

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
Run Code Online (Sandbox Code Playgroud)

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

  • 解决了我的问题.多么糟糕(反直觉,意外)的错误/设计决策(使得选项的顺序相对于位置参数显着)常规选项首先出现,其他参数如下. (4认同)
  • 似乎`-l`选项相对于彼此的顺序也很重要,而更一般/更低级别的依赖关系应该来*last*,而不是*first*.直到我将`-lm`移动到我的选项字符串的***之前,我才得到'未定义的'pow'的引用. (2认同)