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

symbols not found in static library even though they are there

我正在尝试从 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

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

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

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

您可以在 link 时使用 -Wl,--no-demangle 来告诉 linker 打印 mangled (real) symbol that ends up undefined ,这将使您更清楚地知道您实际上没有该符号的定义。

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