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

CMake链接失败求助:已编译echo.c.obj仍提示未定义引用

解决CMake链接失败:undefined reference to echo(int)

问题根源

这是C与C++混合编译的名字修饰(Name Mangling)不匹配问题:

  • echo.c 作为C源码,编译后生成的符号是echo(C语言无名字修饰逻辑)
  • echo_test.cpp 是C源码,编译时会按C规则查找带参数类型修饰的符号(比如_Z4echoi),因此找不到C版本的echo符号,导致链接失败。

解决方案

修改echo.h头文件,添加C/C兼容的声明,让C编译器识别该函数是C语言实现的:

#ifndef ECHO_H
#define ECHO_H

// 针对C++编译器,用extern "C"包裹C函数声明
#ifdef __cplusplus
extern "C" {
#endif

int echo(int a);

#ifdef __cplusplus
}
#endif

#endif // ECHO_H

原理说明

  • __cplusplus是C编译器预定义的宏,仅在编译C代码时生效
  • extern "C"告诉C编译器,包裹内的函数使用C语言的符号规则(不进行名字修饰),这样C代码就能正确链接到C语言编译生成的函数符号。

额外验证(可选)

确认SOURCE_FILES确实包含了echo.c:
可以在CMakeLists.txt中添加打印语句,检查变量内容:

message(STATUS "SOURCE_FILES: ${SOURCE_FILES}")

如果输出中没有src/echo.c,需要调整file(GLOB_RECURSE)的路径,确保能正确匹配到C源文件。

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

相关产品推荐
方舟 Agent Plan

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

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