其他分享
首页 > 其他分享> > c – g未定义的引用虽然* .so文件中存在符号

c – g未定义的引用虽然* .so文件中存在符号

作者:互联网

我发现了许多类似的问题(例如this,thatthis),但没有一个能帮我解决问题.我有一个* .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