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
相关产品推荐
相关产品推荐

