g++ undefined reference 虽然符号存在于 *.so 文件中
g++ undefined reference although symbol is present in *.so file
我发现了许多类似的问题(例如 this, that or this), but none of them helped me solve my problem. I have a *.so file (from the core of 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,但它生成的行与那个类似(它只是在链接之前添加了-rdynamic
),它仍然生成完全相同的链接器错误。
请注意,库和我的最小代码都是使用相同的编译器 (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
那些库中的符号 contained/defined 应该没有区别吧?我在 cmake 关于 add_library
的文档中没有注意到任何内容。我是否漏掉了一些明显的东西?
检查 .so
是否导出符号的迂腐正确的方法是 nm --demangle --dynamic --defined-only --extern-only <lib.so> | grep <symbol>
。
如果没有 --defined-only
,您的命令还会显示 undefined 符号。
如果没有 --extern-only
,它还会显示具有 内部 linkage 的符号,这些符号对于 linking 不可用。
您似乎需要 link 另一个库,因为 Gps_Ephemeris::Gps_Ephermeris()
未通过 linking libgnss_system_parameters_dyn.so
解析。一个好的开始方式是该库的文档和示例。
我过去发现此类错误是由于包含文件中缺少适当的 extern "C" { ... }
括号引起的。
我发现了许多类似的问题(例如 this, that or this), but none of them helped me solve my problem. I have a *.so file (from the core of 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,但它生成的行与那个类似(它只是在链接之前添加了-rdynamic
),它仍然生成完全相同的链接器错误。
请注意,库和我的最小代码都是使用相同的编译器 (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
那些库中的符号 contained/defined 应该没有区别吧?我在 cmake 关于 add_library
的文档中没有注意到任何内容。我是否漏掉了一些明显的东西?
检查 .so
是否导出符号的迂腐正确的方法是 nm --demangle --dynamic --defined-only --extern-only <lib.so> | grep <symbol>
。
如果没有 --defined-only
,您的命令还会显示 undefined 符号。
如果没有 --extern-only
,它还会显示具有 内部 linkage 的符号,这些符号对于 linking 不可用。
您似乎需要 link 另一个库,因为 Gps_Ephemeris::Gps_Ephermeris()
未通过 linking libgnss_system_parameters_dyn.so
解析。一个好的开始方式是该库的文档和示例。
我过去发现此类错误是由于包含文件中缺少适当的 extern "C" { ... }
括号引起的。