【问题标题】:symbols not found in static library even though they are there即使在静态库中也找不到符号
【发布时间】:2021-08-17 09:56:37
【问题描述】:

我正在尝试从 FlightGear 项目构建 TerraGear,它在链接时需要来自静态库 libSimGearBucket 的多个符号,例如 SGBucket::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

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

【问题讨论】:

    标签: linker static-libraries linker-errors symbols ld


    【解决方案1】:

    需要的函数是SGBucket::gen_base_path[abi:cxx11]() const

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

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

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

    【讨论】:

    • 你能解释一下为什么这些符号在 nm 的输出中出现了 3 次吗?两次是 U,一次是 T。
    • @Programmer 这很正常。运行nm -A libSimGearCore.a | grep gen_base_path,就会很明显为什么会发生这种情况。
    • 你能告诉我如何解决这个问题吗:不带 -D 的 nm 显示所有符号,但带 -D 的 nm 不显示?我是否必须重新编译所有内容并添加一些开关,或者什么...
    • @Programmer 这也是正常的:nm -D 显示 dynamic 链接器将解释的符号。存档库中没有这样的符号,它们只出现在可执行文件和共享库中。
    猜你喜欢
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多