Ubuntu上的gcc未定义参考错误

use*_*001 4 c linux compiler-construction ubuntu gcc

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

我正在尝试编译一些代码,即使库是使用 -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 -lmumlpthread

未定义错误列表很长,但第一个是

/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
Run Code Online (Sandbox Code Playgroud)

我确实尝试使用 --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.
Run Code Online (Sandbox Code Playgroud)

Ubuntu 是 64 位 Ubuntu 12.10

有没有人知道我是否遇到错误或发生了什么?

use*_*001 6

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

据此,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/ 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 -lretime2 - lnuma -lpthread -lm -lrt