链接器错误未定义引用,即使在共享库中定义函数也是如此

Linker error undefined reference even if functions are defined in shared library

提问人:user2562211 提问时间:5/5/2021 更新时间:5/5/2021 访问量:364

问:

我正在尝试修改一段C++代码(在 Linux 下使用 gcc 工具链开发),使用在两个库中定义的新功能,一个共享库(称为 libsio4_api.so)和一个静态库(称为 sio4_main.a)。原始代码是使用一个 makefile 构建的,该 makefile 首先创建一个共享库,链接各种对象文件,然后将此库与主对象文件链接。 这是链接共享库的行:

g++ -s -shared main.o RTLinkResolution.o IORefresh.o UserProgramImpl.o UserProgramDataManager.o UserProgramCode.o -L./genericFiles/lib -lUserProgramEnvironment -lm -o libUProg.so

我以这种方式修改了它以将我的库添加到链接中(其中一个需要 -pthread):

g++ -s -shared -pthread libsio4_api.so sio4_main.a main.o RTLinkResolution.o IORefresh.o UserProgramImpl.o UserProgramDataManager.o UserProgramCode.o -L./genericFiles/lib -lUserProgramEnvironment -lm -o libUProg.so

此链接终止时没有错误,在生成的库中,我可以看到我想使用的函数(在此示例中,我只显示一个函数,但也显示了其他函数):

nm -D libUProg.so | grep sio4_async_init
000000000006d581 T sio4_async_init
000000000006dcae T sio4_async_init_data
             U _Z15sio4_async_initv

问题是,当最终链接完成时,找不到函数:

g++ -o test main.o libUProg.so -pthread sio4_main.a libsio4_api.so
libUProg.so: undefined reference to `sio4_async_close(int)'
libUProg.so: undefined reference to `sio4_async_init()'
libUProg.so: undefined reference to `sio4_async_open(int, int, int*)'

我已经在其他主题中搜索了类似的问题,我发现将库馈送到链接器的顺序很重要,但即使我在最终链接命令中更改了顺序,也找不到这些函数。 有人对我如何进行有任何线索吗?

C++ gcc 共享库 static-libraries 链接器错误

评论

1赞 KamilCuk 5/5/2021
你忘了吗?是否来自 C 源文件?extern "C"libUProg.so
0赞 user2562211 5/5/2021
这也许就是问题所在。新库是用 C 编写的源文件中的 gcc 编译的,而在这里我用 g++ 编译 c++ 代码。
0赞 KamilCuk 5/5/2021
然后研究什么是名称篡改以及做什么。extern "C"

答: 暂无答案