Libserial 1.0库静态链接时linker找不到对应方法是什么原因?
报错原因分析
- 链接顺序错误:GCC的ld链接器处理输入文件遵循从左到右的顺序,只会保留当前已经出现的未定义符号需要的实现。你现在把
libserial.a放在了main.cpp前面,链接器处理静态库的时候还不知道后续main.cpp需要用到哪些LibSerial的符号,直接就把静态库中的符号全部丢弃了,等到处理main.cpp产生的目标文件时,需要的LibSerial符号已经找不到对应的实现,就报未定义引用错误。 - C++ ABI不匹配:从报错信息中的
std::__cxx11::basic_string可以看出你当前编译测试程序用的是GCC 5及以后版本引入的新C++ ABI,如果你编译LibSerial静态库的时候使用的编译参数和当前测试程序不一致(比如使用了旧C++标准、定义了_GLIBCXX_USE_CXX11_ABI=0强制使用旧ABI),也会导致符号命名不匹配,链接器找不到对应实现。 - 静态库本身编译异常:如果编译LibSerial的时候配置错误、编译过程有未注意到的报错,生成的静态库本身就缺失对应符号,也会出现该报错。
修复方案
- 首先调整编译命令的文件顺序,将源文件/目标文件放在静态库的前面,修改后的编译命令如下:
g++ -std=gnu++11 -I/home/thomas/Downloads/libserial/src main.cpp /home/thomas/Downloads/libserial/lib/libserial.a
- 如果调整顺序后仍然报错,排查ABI匹配问题:重新编译LibSerial库,编译时使用和测试程序完全一致的编译参数(同样指定
-std=gnu++11),如果需要强制对齐ABI,可以在编译命令中添加-D_GLIBCXX_USE_CXX11_ABI=1参数和当前测试程序保持一致。 - 如果静态链接时出现其他系统库未定义引用,可以在编译命令末尾补充依赖库,比如
-lpthread。
内容的提问来源于stack exchange,提问作者LobisoVanDeTap
相关产品推荐
相关产品推荐

