Makefile链接新增静态库libmm.a时出现undefined reference错误
静态库链接undefined reference排查方案
- 检查链接顺序
gcc链接器按从左到右顺序搜索符号,调用方必须放在被依赖库的左侧。如果你的业务代码或者其它依赖库调用了libmm的函数,需要调整
LIBS中-lmm的位置到依赖它的模块之后。同时你当前配置中-lcli重复定义,可以删除多余的项,调整后的参考配置:LIBS=-lpthread -lrt -L CommandParser -lcli -L LinuxMemoryManager -lmm - 检查C/C符号兼容
如果libmm为C编译、主项目为C开发,或者反过来,需要在libmm的对外头文件中用extern "C"包裹函数声明,避免符号修饰不匹配:
修改后重新编译libmm.a再尝试链接。#ifdef __cplusplus extern "C" { #endif /* 所有对外导出函数的声明放在此处 */ #ifdef __cplusplus } #endif - 确认libmm.a符号导出正常
执行以下命令检查对应函数是否正常导出:
如果输出中对应符号前缀为大写nm LinuxMemoryManager/libmm.a | grep <报错的函数名>T说明正常导出,否则说明函数未被编译进静态库,需要检查libmm的编译配置。 - 确认库文件版本正确
清理LinuxMemoryManager目录下的旧编译产物,重新编译libmm.a,确保链接的是包含对应函数的最新版本。 - 检查编译参数一致性
确认编译libmm时的CFLAGS和主项目的CFLAGS保持一致,避免因宏定义差异导致函数没有被编译进库。
内容的提问来源于stack exchange,提问作者Abhishek Sagar
相关产品推荐
相关产品推荐

