You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

链接器报错:共享库函数出现“undefined reference”问题排查

排查方向

1. 修复C/C++名称不兼容问题

C编译器会对函数名进行名称修饰(Name Mangling),而你的C共享库导出的是C风格的未修饰符号。直接在C代码中包含C头文件会导致编译器生成修饰后的函数调用,无法匹配库中的符号。

解决方法:

  • 要么在C++项目中包含头文件时用extern "C"块包裹:
extern "C" {
#include "statistics.h"
}
  • 要么修改statistics.h本身,让它在C++环境下自动适配:
#ifdef __cplusplus
extern "C" {
#endif

const char* print_perf_measurements(measurement_t *measurement, int logger);
extern perf_measurement_t *measure_cycle_count;

#ifdef __cplusplus
}
#endif

2. 确认编译时头文件与参数的正确性

  • 检查C++项目编译proj.cc时是否用-I参数指定了statistics.h的所在目录,避免因找不到头文件导致函数隐式声明,生成错误的符号。
  • 验证proj.cc中调用print_perf_measurements的参数类型是否和头文件完全一致,比如measurement_t的定义在C和C++项目中必须完全相同,类型不匹配也会导致符号无法匹配。

3. 验证链接时库的查找路径

  • 确保libcounters.so在系统默认库路径(如/usr/lib),或者在链接命令中用-L参数指定库所在目录(例如库在/opt/lib时,添加-L/opt/lib)。
  • 可以执行g++ -Wl,--verbose -o proj file1.o file2.o file3.o -lpthread -lcap -lcounters -lrt查看链接过程,确认编译器是否真的找到了libcounters.so。

4. 检查符号匹配情况

  • 从proj.o中提取相关符号:nm proj.o | grep print_perf,然后用c++filt解析该符号,如果解析后是带参数类型的修饰名,说明没有添加extern "C"导致符号不匹配。

5. 再次确认链接顺序

虽然你提到调整过顺序,但需确保依赖库放在使用它的目标文件之后。当前你的链接命令顺序是正确的:

g++ -W -Wall -g -O2 -o proj file1.o file2.o file3.o -lpthread -lcap -lcounters -lrt

如果之前出现过顺序颠倒的情况,再次确认当前顺序无误。

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 22:03:15