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

