首页 > 解决方案 > 即使在静态库中也找不到符号

问题描述

我正在尝试从 FlightGear 项目构建 TerraGear,它libSimGearBucket在链接时需要来自静态库的多个符号,例如SGBucket::gen_base_path. ld失败了

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

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

标签: linkerstatic-librarieslinker-errorssymbolsld

解决方案


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

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

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

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


推荐阅读