在Ubuntu上的gcc未定义参考错误
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Ubuntu上的gcc未定义参考错误,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2937字,纯文字阅读大概需要5分钟。
内容图文
![在Ubuntu上的gcc未定义参考错误](/upload/InfoBanner/zyjiaocheng/948/4eb7ea5f9ca64d82a39ef1a62d5befc1.jpg)
我有一个奇怪的问题,我经历了所有类似的问题,但找不到答案.
我正在尝试编译一些代码,即使该库是使用-l指定的,并且也位于LD_LIBRARY_PATH中,该代码仍会引发未定义的引用错误.我不知道原因.这是一个例子
gcc -L/home/sam/gmdb/lib -L/home/sam/db/add-ons/lib
-L/home/sam/convert/lib -L/home/sam/rtana/lib -L/home/sam/rtana/add-ons/lib -o /home/sam/gmdb/bin/server /home/sam/db/obj/tools/server/server.o
/home/sam/db/obj/tools/common/tool_data_parse.o
/home/sam/db/obj/tools/common/tool_param.o
/home/sam/gmdb/obj/tools/common/tool_public.o -lgmcommon
-L/home/sam/db/add-ons/vpp/lib/suse -lipsi_crypto -lipsi_osal -lipsi_pse -lipsi_ssl -lgmmd5 -lgmkernel -lgmpl -lgmrep -lgmsqlserver -lgmsqlclient -lconvert -lrtana -lglog -lgflags -lprotobuf -lre2 -lboost_timer -lnuma -lpthread -lm -lrt
未定义错误的列表很长,但第一个是
/home/usama/convert/lib/libconvert.so: undefined reference to
`numa_num_configured_cpus’
因此,您可以看到它抱怨libnuma中的方法.如您所见,libnuma提供了-lnuma,并存在于/usr/lib中
该错误提到libconvert,它只是一个共享库,可调用numa_num_configured_cpus,但未与libnuma链接,这无关紧要,因为libconvert只是一个so文件.如上所示,我在生成可执行文件时提供了-lnuma.这是libconvert上的nm输出
nm -C -u convert/lib/libconvert.so | grep numa*
U google::protobuf::internal::NameOfEnum(google::protobuf::EnumDescriptor const*, int)
U numa_num_configured_cpus
U numa_num_configured_nodes
我确实尝试使用–unresolved-symbols进行编译,这导致编译成功,但是二进制文件由于抱怨未定义符号而无法再次运行.
我的GCC版本是
gcc --version
gcc (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Ubuntu是64位的Ubuntu 12.10
如果我遇到错误或正在发生什么情况,有人知道吗?
解决方法:
伙计们感谢您的评论.我发现的问题是因为gcc的默认行为已在Ubuntu中更改(至少我正在使用的版本)提示在debian https://wiki.debian.org/ToolChain/DSOLinking的此Wiki页面上
据此,将gcc更改为在链接器中按需添加-.这种行为的缺点是,我引用Wiki“使用间接链接的共享库中的符号的二进制文件将无法链接”
这正是我的问题,因为libconvert使用libnuma,但未链接到它,而我正在构建的二进制文件试图将包括libconvert和libnuma在内的所有内容链接到它.默认的gcc之所以可以工作是因为它使用了不需要的行为,该行为在Debian中已更改,并且也已在Ubuntu中使用.
简而言之,如果我添加-Wl,则不需要链接.
gcc -Wl,–no-as-needed -L/home/sam/gmdb/lib -L/home/sam/db/add-ons/lib
-L/home/sam/convert/lib -L/home/sam/rtana/lib -L/home/sam/rtana/add-ons/lib -o /home/sam/gmdb/bin/server /home/sam/db/obj/tools/server/server.o
/home/sam/db/obj/tools/common/tool_data_parse.o
/home/sam/db/obj/tools/common/tool_param.o
/home/sam/gmdb/obj/tools/common/tool_public.o -lgmcommon
-L/home/sam/db/add-ons/vpp/lib/suse -lipsi_crypto -lipsi_osal -lipsi_pse -lipsi_ssl -lgmmd5 -lgmkernel -lgmpl -lgmrep -lgmsqlserver -lgmsqlclient -lconvert -lrtana -lglog -lgflags -lprotobuf -lre2 -lboost_timer -lnuma -lpthread -lm -lrt
内容总结
以上是互联网集市为您收集整理的在Ubuntu上的gcc未定义参考错误全部内容,希望文章能够帮你解决在Ubuntu上的gcc未定义参考错误所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。