链接器找不到符号,但已读取库且存在符号



我一直在尝试编译我的项目,但遇到了undefined reference错误。 例如:

installertest.cpp:(.text+0x9d1): undefined reference to `XmlRpcValue::makeArray()'
...
installertest.cpp:(.text+0xede): undefined reference to `dbcancel'
installertest.cpp:(.text+0xefd): undefined reference to `dbfcmd'
installertest.cpp:(.text+0xf0f): undefined reference to `dbsqlexec'
installertest.cpp:(.text+0xf2d): undefined reference to `SHA1_Init'
...

我的命令行是:

g++ -o installertest 
    -lsybdb 
    -lxmlrpc 
    -lxmlrpc_cpp 
    -lxmlrpc_xmlparse 
    -lxmlrpc_xmltok 
    -lxmlrpc_util 
    -lxmlrpc++ 
    -lxmlrpc_server_cgi 
    -lssl 
    -std=c++0x 
    ContractData.o installertest.o

objdump -T显示符号位于 .so 文件中。 例如:

libsybdb.so:
...
0000000000011c30 g    DF .text  0000000000000083  Base        dbcancel
...
/usr/lib/libxmlrpc_cpp.so:
...
0000000000002e78 g    DF .text  0000000000000092  Base        _ZN11XmlRpcValue9makeArrayEv
...

strace显示链接器正在打开和读取库文件:

...
[pid  5019] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libsybdb.so", {st_mode=S_IFREG|0644, st_size=421608, ...}) = 0
[pid  5019] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libsybdb.so", O_RDONLY) = 7
[pid  5019] fcntl(7, F_GETFD)           = 0
[pid  5019] fcntl(7, F_SETFD, FD_CLOEXEC) = 0
[pid  5019] fstat(7, {st_mode=S_IFREG|0644, st_size=421608, ...}) = 0
[pid  5019] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b16c200c000
[pid  5019] lseek(7, 0, SEEK_SET)       = 0
[pid  5019] read(7, "177ELF2113>1P237"..., 4096) = 4096
...
[pid  5019] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libxmlrpc.so", {st_mode=S_IFREG|0644, st_size=80936, ...}) = 0
[pid  5019] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libxmlrpc.so", O_RDONLY) = 8
[pid  5019] fcntl(8, F_GETFD)           = 0
[pid  5019] fcntl(8, F_SETFD, FD_CLOEXEC) = 0
[pid  5019] fstat(8, {st_mode=S_IFREG|0644, st_size=80936, ...}) = 0
[pid  5019] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b16c200d000
[pid  5019] lseek(8, 0, SEEK_SET)       = 0
[pid  5019] read(8, "177ELF2113>1300?"..., 4096) = 4096
...

所有涉及的文件都面向 x86-64,C 库的标头extern "C" 。我已经尝试了我能想到的一切,但它仍然无法链接。

我什至尝试删除所有 C++11 代码并在没有命令行开关的情况下进行编译,但仍然一无所获。

我的系统是 Ubuntu Precise (12.04) 64 位,使用 g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 如果有帮助的话。所有软件包都是从包管理器安装的,并且安装了开发包。

编辑 (2017-05-30):标记为重复 https://stackoverflow.com/questions/45135/why-does-the-order-in-which-libraries-are-linked-sometimes-cause-errors-in-gcc
另一个问题是为什么参数的顺序很重要。当提出问题时,不知道论证顺序是一个问题。
此外,上一个问题不包含任何有用的扩展,而这个问题显示了手头的问题。
上一个问题可以被视为对这个问题的答案的有益扩展,但不是重复。

您必须将库的链接器标志放在目标文件之后。所以,而不是

g++ -o installertest 
-lsybdb 
-lxmlrpc 
-lxmlrpc_cpp 
-lxmlrpc_xmlparse 
-lxmlrpc_xmltok 
-lxmlrpc_util 
-lxmlrpc++ 
-lxmlrpc_server_cgi 
-lssl 
-std=c++0x 
ContractData.o installertest.o

g++ -o installertest 
ContractData.o installertest.o 
-lsybdb 
-lxmlrpc 
-lxmlrpc_cpp 
-lxmlrpc_xmlparse 
-lxmlrpc_xmltok 
-lxmlrpc_util 
-lxmlrpc++ 
-lxmlrpc_server_cgi 
-lssl 
-std=c++0x

最新更新