Linker 在静态库中找不到符号,即使它们存在
我正在尝试从FlightGear项目构建TerraGear,它需要链接时从静态库Linker 在静态库中找不到符号,即使它们存在,linker,static-libraries,linker-errors,symbols,ld,Linker,Static Libraries,Linker Errors,Symbols,Ld,我正在尝试从FlightGear项目构建TerraGear,它需要链接时从静态库libSimGearBucket中获得多个符号,例如SGBucket::gen_base_pathld在以下情况下失败 警告:未定义对»SGBucket::gen_base_path[abi:cxx11]()常量的引用 这些在库中定义: $nm libSimGearCore.a | grep gen_base_路径 0000000000000 1F0吨锌K8SGBucket13Gen_基地 ZNK8SGBucket
libSimGearBucket
中获得多个符号,例如SGBucket::gen_base_path
<代码>ld在以下情况下失败
警告:未定义对»SGBucket::gen_base_path[abi:cxx11]()常量的引用
这些在库中定义:
$nm libSimGearCore.a | grep gen_base_路径
0000000000000 1F0吨锌K8SGBucket13Gen_基地
ZNK8SGBucket13gen_base_pathEv
ZNK8SGBucket13gen_base_pathEv
我确保库链接到需要符号的程序。怎么了?您需要的函数是SGBucket::gen_base_path[abi:cx11]()const
您拥有的函数是SGBucket::gen\u base\u path()const
。这些符号不一样
您可以在链接时使用-Wl,--no-demangle
告诉链接器打印最终未定义的损坏(真实)符号,这将更清楚地表明您实际上没有该符号的定义
可能是
libSimGearCore.a
库在编译时没有-std=c++11
标志,而需要符号的代码是用它编译的。您能解释为什么符号在nm的输出中出现三次吗?两倍于U,一倍于T。这是正常的。运行nm-A libSimGearCore.A | grep gen_base_path
就会明白为什么会发生这种情况。您能否告诉我如何解决这个问题:不带-D的nm显示所有符号,而带-D的nm不显示任何符号?我是否必须重新编译所有内容并添加一些开关,或者…@程序员这也是正常的:nm-D
显示动态链接器将解释的符号。存档库中没有这样的符号,它们只出现在可执行文件和共享库中。