未定义的引用,尽管符号存在于 .so 中

Undefined reference although symbol present in .so

提问人:Przemysław Czechowski 提问时间:8/1/2018 最后编辑:pseyfertPrzemysław Czechowski 更新时间:8/1/2018 访问量:607

问:

免责声明:我知道像这样那样的问题,但没有什么能帮助我解决我的问题。

我正在尝试编译一个依赖于ROOT包的更大项目,并且我能够在最小的示例中重现我面临的错误:

测试.cpp:

#include "Math/GenVector/GenVector_exception.h"
int main()
{
  ROOT::Math::GenVector::Throw("foo");
}

编译方式: 给出:g++ -lGenVector test.cpp

/tmp/ccq9A45m.o: In function `main':
test.cpp:(.text+0xc): undefined reference to `ROOT::Math::GenVector::Throw(char const*)'
collect2: error: ld returned 1 exit status

本地化 libGenVector.so 提供:ld --verbose -lGenVector | grep "lib GenVector.so succeeded"

attempt to open //usr/local/lib/libGenVector.so succeeded

检查是否在库中定义了符号,并给出:nm -DgC --defined-only /usr/local/lib/libGenVector.so| grep Throw

000000000003f180 T ROOT::Math::Throw(ROOT::Math::GenVector_exception&)
000000000003f1e0 T ROOT::Math::GenVector::Throw(char const*)

根据对这个问题的回答,我还尝试使用 and 和进行编译,但一切都给出了相同的错误消息。-std=c++11-std=c++14-std=c++17

C++ 链接器 ld undefined-reference root-framework

评论

4赞 Some programmer dude 8/1/2018
订单很重要!如果源文件、对象文件或库依赖于库,则必须在命令行上位于 前面。ABAB
0赞 Przemysław Czechowski 8/1/2018
哦,太好了,我看到了作品!谢谢,@Someprogrammerdude,如果你把它写成答案,我会接受的。g++ test.cpp -lGenVector
0赞 pseyfert 8/1/2018
在实践中(与问题无关),使用 root,我发现在检查 .so 文件的内容之前检查 rootmap 文件更有用,以便进行一种人类可读的查找“我应该链接到哪个类以使用哪个类”(虽然没有依赖项)。
0赞 pseyfert 8/1/2018
而且,对于 c++ 标准,我会使用而不是猜测 - 我预计一旦您根据与 root 不同的 c++ 标准版本构建项目,麻烦就会浮出水面。root-config --cflags-std=c++1?

答: 暂无答案