2017-04-06 125 views
32

我发现了一些类似的问题(例如this,thatthis),但没有一个帮助我解决了我的问题。我有一个* .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_librarycmake的的文档任何东西。我错过了明显的东西吗?

+3

你说输出_包含符号'Gps_Ephemeris :: Gps_Ephermeris()'_,但不显示实际的输出。这是相关的,并且会很有用。此外,您显然没有将该符号复制并粘贴到问题中,因为您拼错了它。我对这种书面摘要不信任,因为如果你是一个可靠的评判者,你可能不会问这个问题。 – Useless

+0

感谢您的注意,我解决了它。我主要是做高级计算机视觉,所以是的,我觉得没有资格判断要排除什么。我会尽快发布输出。 – Ash

+0

没有看源代码,很难说明为什么.so和.a从相同的源构建出口不同的符号。有条件编译可能涉及。 –

回答

17

的迂腐正确的方法来检查一个.so出口的标志是nm --demangle --dynamic --defined-only --extern-only <lib.so> | grep <symbol>

没有--defined-only您的命令还显示undefined符号。

没有--extern-only它也显示符号与内部链接这是不可用于链接。

它看起来像你需要链接另一个库,因为Gps_Ephemeris::Gps_Ephermeris()不链接libgnss_system_parameters_dyn.so解决。开始的一个好方法是图书馆的文件和例子。

+0

非常感谢!你是对的。但是,这些符号存在于(等效的)静态库中。我在最后用一些信息更新了这个问题。你可以看一下吗? – Ash

1

我在过去发现,这种类型的错误是缺乏适当的extern "C" { ... }在include文件包围引起的。

+1

你能详细说明'extern“C”'链接如何处理构造函数吗? –

+0

它没有。它们不是C的一部分,而是C++的一部分。 – Nicole