15

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

谢谢你。

4

2 回答 2

32

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

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

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

于 2012-09-05T00:04:04.933 回答
1

我认为它是由找不到符号引起的,gcc会先从左到右,尝试将lib文件放在最后

于 2012-09-05T01:41:14.277 回答