【发布时间】:2012-06-22 03:53:50
【问题描述】:
我一直在尝试编译我的项目,但遇到了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, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\237\0\0\0\0\0\0"..., 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, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\300?\0\0\0\0\0\0"..., 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 重复
其他问题询问为什么论点的顺序很重要。提出问题时,不知道参数顺序是一个问题。
此外,上一个问题不包含任何有用的扩展,而这个问题显示了手头的问题。
上一个问题可能被视为对这个问题的答案的有益扩展,但不是重复。
【问题讨论】:
-
嗨,本。你能告诉我如何使用 strace 来检查这个过程吗?我的主要困难是关于如何获得 PID,因为编译过程很快就结束了。我只使用 ps aux | grep 获取PID,但是进程已经死了。
-
@XingWang,没问题。您只需在命令行前添加“strace -f -e trace=all”即可。根据您的系统,您可能还需要添加“sudo”。所以,从我的例子来看:“strace -f -e trace=all g++ -o installertest ContractData.o installertest.o”...
标签: linux g++ ld shared-objects