加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – Linked无法找到符号,但读取库并存在符号

发布时间:2020-12-13 19:54:12 所属栏目:Linux 来源:网络整理
导读:我一直在尝试编译我的项目,我得到了未定义的引用错误.例如.: installertest.cpp:(.text+0x9d1): undefined reference to `XmlRpcValue::makeArray()'...installertest.cpp:(.text+0xede): undefined reference to `dbcancel'installertest.cpp:(.text+0xefd
我一直在尝试编译我的项目,我得到了未定义的引用错误.例如.:
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,...}) = 0
[pid  5019] mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANONYMOUS,-1,0) = 0x2b16c200c000
[pid  5019] lseek(7,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_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,FD_CLOEXEC) = 0
[pid  5019] fstat(8,0) = 0x2b16c200d000
[pid  5019] lseek(8,SEEK_SET)       = 0
[pid  5019] read(8,"177ELF2113>1300?"...,4096) = 4096
...

涉及的所有文件都针对x86-64,C库的头部是外部“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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读