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

CMake中无法链接静态库,测试可执行文件报src目录函数未定义引用错误

问题修复方案

1. 修正根目录CMakeLists.txt的子目录引入顺序

你当前先引入了test子目录,再引入src子目录,处理测试构建逻辑时tic_tac_toe-lib静态库目标还未被定义,会导致测试链接时找不到对应的库目标。
修改顺序为:先编译依赖库,再编译测试:

# 原错误顺序
# add_subdirectory(test)
# add_subdirectory(src)
# add_subdirectory(googletest)
# 修改后顺序
add_subdirectory(src)
add_subdirectory(googletest)
add_subdirectory(test)

另外此处存在拼写错误:set(CXXMAKE_C_STANDARD 11)是错误变量名,正确应为设置C++标准的CMAKE_CXX_STANDARD:

# 错误写法
# set(CXXMAKE_C_STANDARD 11)
# 正确写法
set(CMAKE_CXX_STANDARD 11)

2. 修复C/C++混编的符号匹配问题

你的src目录是C语言代码,test目录是C代码,C编译器会对函数名做名字修饰,直接引用C语言函数会出现符号不匹配的问题,需要在src的头文件中加入extern "C"包裹声明:
在src/tic-tac-toe.h(注意和你实际使用的头文件名统一)头部添加如下判断:

#ifdef __cplusplus
extern "C" {
#endif

// 原有头文件的所有函数声明、类型定义放在此处

#ifdef __cplusplus
}
#endif

3. 核对源文件名称一致性

你给出的项目结构中src目录下的文件是source1.c、source1.h,但src的CMakeLists.txt里写的源文件是tic-tac-toe.c、tic-tac-toe.h,需要确认文件名是否对应,避免编译出的静态库实际没有包含你需要的函数实现。

4. 可选:补充测试目标的头文件包含

虽然你在根目录加了全局的include_directories(src),更规范的做法是在test的CMakeLists.txt中显式声明头文件路径:

target_include_directories(TIC-TAC-TOE-TEST PUBLIC ../src)

修改完成后重新执行构建即可解决链接未定义引用的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:18:02