Ucc上的gcc未定义引用错误

时间:2014-01-15 14:36:55

标签: c linux ubuntu gcc compiler-construction

我有一个奇怪的问题,我已经完成了所有类似的问题,但找不到答案。

我正在尝试编译一些代码,这些代码不断引发未定义的引用错误,即使使用-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 /家庭/ SAM / DB /插件/ 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:未定义的引用   `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

如果我遇到错误或发生了什么事,有没有人知道?

1 个答案:

答案 0 :(得分:4)

伙计们,感谢您的评论。我发现的问题是因为在Ubuntu中更改了gcc的默认行为(至少我正在使用的版本)该提示位于debian https://wiki.debian.org/ToolChain/DSOLinking的这个维基页面上

根据这一点,gcc被更改为向链接器添加--as-needed。这种行为的缺点是,我引用维基“二进制文件,它使用间接链接的共享库中的符号将无法链接”

这正是我的问题,因为libconvert正在使用libnuma,但没有链接到它,而我正在构建的二进制文件试图链接包括libconvert和libnuma在内的所有内容。默认的gcc会起作用,因为它使用了不需要的行为,这种行为在Debian中被更改并且也被用于Ubuntu。

简而言之,如果我添加-Wl,--no-as-needed,链接就会起作用。

  

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 /家庭/ SAM / DB /插件/ 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