我发现了一些类似的问题(例如this,that或this),但没有一个帮助我解决了我的问题。我有一个* .so文件(从gnss-sdr核心),作为表示由:g ++ undefined reference虽然符号出现在* .so文件中
$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标准。
寻址由马克西姆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
这些库中包含/定义的符号应该没有区别,对吧?我没有注意到在add_library
在cmake的的文档任何东西。我错过了明显的东西吗?
你说输出_包含符号'Gps_Ephemeris :: Gps_Ephermeris()'_,但不显示实际的输出。这是相关的,并且会很有用。此外,您显然没有将该符号复制并粘贴到问题中,因为您拼错了它。我对这种书面摘要不信任,因为如果你是一个可靠的评判者,你可能不会问这个问题。 – Useless
感谢您的注意,我解决了它。我主要是做高级计算机视觉,所以是的,我觉得没有资格判断要排除什么。我会尽快发布输出。 – Ash
没有看源代码,很难说明为什么.so和.a从相同的源构建出口不同的符号。有条件编译可能涉及。 –