gpt4 book ai didi

c++ - g++ undefined reference ,尽管 *.so 文件中存在符号

转载 作者:IT老高 更新时间:2023-10-28 12:37:48 26 4
gpt4 key购买 nike

我发现了许多类似的问题(例如 thisthatthis ),但它们都没有帮助我解决我的问题。我有一个 *.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,但是它生成的那一行是类似的(它只是在链接之前添加了-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

这些库中包含/定义的符号应该没有区别,对吧?我没有注意到 cmake 关于 add_library 的文档中的任何内容。我错过了什么明显的东西吗?

最佳答案

检查 .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 解决.一个好的开始方式是该库的文档和示例。

关于c++ - g++ undefined reference ,尽管 *.so 文件中存在符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43256459/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com