我有一个奇怪的问题,我已经完成了所有类似的问题,但找不到答案。
我正在尝试编译一些代码,这些代码不断引发未定义的引用错误,即使使用-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
的nmnm -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
如果我遇到错误或发生了什么事,有没有人知道?
答案 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