Ubuntu 上的 gcc 未定义引用错误

问题描述 投票:0回答:1

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

我正在尝试编译一些代码,即使该库是使用 -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:未定义的引用 `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

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

c linux ubuntu gcc
1个回答
7
投票

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

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

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

所以简而言之,如果我添加

-Wl,--no-as-needed
,链接就会起作用。

gcc -Wl,--没有需要的 -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

© www.soinside.com 2019 - 2024. All rights reserved.