在静态库中找不到符号,即使它们在那里

symbols not found in static library even though they are there

提问人:TheEagle 提问时间:5/29/2021 更新时间:5/30/2021 访问量:1163

问:

我正在尝试从 FlightGear 项目构建 TerraGear,例如,它在链接时需要来自静态库的多个符号。 失败,并显示libSimGearBucketSGBucket::gen_base_pathld

warning: undefined reference to »SGBucket::gen_base_path[abi:cxx11]() const

这些在库中定义:

$ nm libSimGearCore.a | grep gen_base_path
00000000000001f0 T _ZNK8SGBucket13gen_base_pathEv
                 U _ZNK8SGBucket13gen_base_pathEv
                 U _ZNK8SGBucket13gen_base_pathEv

我三重确保库链接到需要符号的程序。怎么了?

链接器 static-libraries linker-errors 符号 ld

评论


答:

2赞 Employed Russian 5/30/2021 #1

您需要的功能是 。SGBucket::gen_base_path[abi:cxx11]() const

拥有的功能是 。这些不是同一个符号。SGBucket::gen_base_path() const

您可以在链接时告诉链接器打印最终未定义的真实)符号,这将使您实际上没有该符号的定义更清楚。-Wl,--no-demangle

可能该库是在没有标志的情况下编译的,而需要符号的代码是用它编译的。libSimGearCore.a-std=c++11

评论

0赞 TheEagle 5/30/2021
您能解释一下为什么该符号在nm的输出中出现三次吗?两次为U,一次为T。
1赞 Employed Russian 5/30/2021
@Programmer 这是正常的。运行,为什么会发生这种情况会变得很明显。nm -A libSimGearCore.a | grep gen_base_path
0赞 TheEagle 5/31/2021
您还能告诉我如何解决这个问题:没有 -D 的 nm 显示所有符号,但带有 -D 的 nm 不显示任何符号吗?我是否必须重新编译所有内容并添加一些开关,或者什么......
1赞 Employed Russian 5/31/2021
@Programmer 这也是正常的:显示动态链接器将解释的符号。存档库中没有这样的符号,它们只出现在可执行文件和共享库中。nm -D