linux - Linux : "undefined reference to" 上的链接器错误

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

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

关于linux - Linux : "undefined reference to" 上的链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12272864/

相关文章:

maven - Gradle下载依赖错误

objective-c - 为什么最终二进制文件的大小会比静态库的大小小得多?

c# - 编译器构建错误 : The call is ambiguous between the f

android - com.android.ide.common.process.ProcessEx

gradle - 用gradle复制树并改变结构?

c++ - 带有子目录的 CMake

java - ANT:如何将 "add"路径元素从一条路径转换为第二条路径?

build - 是否可以将命令行变量传递给 bitbake 构建?

database - 如何从现有数据库数据生成 Symfony 固定装置 YAML?

powershell - 如何在 TFS2013 构建中将构建参数和其他信息传递给 powershe