c – g未定义的引用虽然* .so文件中存在符号
作者:互联网
我发现了许多类似的问题(例如this,that或this),但没有一个能帮我解决问题.我有一个* .so文件(来自gnss-sdr的核心),如下所示:
$nm libgnss_system_parameters_dyn.so | c++filt |grep Gps_Eph
包含符号Gps_Ephemeris :: Gps_Ephemeris(),它应该是一个构造函数.
我写了一些最小的代码:
#include <iostream>
#include <core/system_parameters/gps_ephemeris.h>
int main(int argc,const char* argv[])
{
Gps_Ephemeris ge;
return 0;
}
我编译的是:
g++ main.cpp -std=c++0x -I some_include_path -L some_lib_path -l gnss_system_parameters_dyn`
然后链接器抱怨:
/tmp/ccHCvldG.o: In function `main':
main.cpp:(.text+0x33): undefined reference to `Gps_Ephemeris::Gps_Ephemeris()'
collect2: error: ld returned 1 exit status
我也尝试过cmake,但是它生成的行与之类似(它只是在链接之前添加了-dynamic),它仍然生成完全相同的链接器错误.
请注意,库和我的最小代码都使用相同的编译器(g -5)进行编译,具有完全相同的标志和相同的c 0x标准.
解决Maxim Egorushkin的答案:
nm --demangle --defined-only --extern-only libgnss_system_parameters.so |grep Gps_Eph
不输出任何东西.但是,符号在静态库中定义(即* .a库):
00000000000006b0 T Gps_Ephemeris::Gps_Ephemeris()
00000000000006b0 T Gps_Ephemeris::Gps_Ephemeris()
知道两者都是由cmake生成的,方式如下:
add_library(lib_name SHARED ${sources_etc}) #for the *.so
add_library(lib_name_2 ${sources_etc}) #for the *.a
这些库中包含/定义的符号应该没有区别,对吧?我在cmake的add_library文档中没有注意到任何内容.我错过了一些明显的东西吗
解决方法:
检查.so导出符号的迂腐正确的方法是nm –demangle –dynamic –defined-only –extern-only< lib.so> | grep< symbol>.
如果没有–defined-only,您的命令也会显示未定义的符号.
如果没有–extern-only,它还会显示具有内部链接的符号,这些符号不可用于链接.
看起来您需要链接另一个库,因为通过链接libgnss_system_parameters_dyn.so无法解析Gps_Ephemeris :: Gps_Ephermeris().一个好的开始方式是库的文档和示例.
标签:name-mangling,c,g,undefined-reference 来源: https://codeday.me/bug/20191004/1854041.html