代码示例:1.1.5 CMake 入门与多目录项目
全部示例均标注编译命令、适用环境与实测状态;完整验证记录见《03.5-代码编译运行验证记录》。
examples/ex1-minimal/CMakeLists.txt · 最小项目(cmake_minimum_required/project/add_executable + out-of-source 构建)
cmake_minimum_required(VERSION 3.16) project(elr_demo C) add_executable(app src/main.c)examples/ex2-multidir/CMakeLists.txt · 多目录工程(add_subdirectory + add_library + PUBLIC 头文件传播 + PRIVATE 链接)
cmake_minimum_required(VERSION 3.16) project(elr_multidir C) add_subdirectory(lib) add_executable(app src/main.c) # app 链接 mymath 后,mymath 的 PUBLIC 头文件路径自动传播给 app(无需手写 include 路径) target_link_libraries(app PRIVATE mymath)examples/ex3-cmake-diagnostics.txt · 配置与链接错误诊断(diagnostic:漏 target_link_libraries 的两种真实报错)
# 1.1.5 CMake 诊断示例(diagnostic:预期报错,均为 cmake 4.2.3 实测真实文本) # 实验工程 = ex2-multidir(lib/mymath 提供 square,src/main.c 调用) # # —— 诊断 A:漏写 target_link_libraries —— # 现象:连头文件都找不到(编译期报错)。原因:mymath 的头文件路径是 PUBLIC, # 只随"链接关系"传播;不链接 mymath,app 就拿不到该路径。 # 真实报错(cmake --build build 输出节选): # src/main.c:2:10: fatal error: mymath.h: No such file or directory # mingw32-make[2]: *** [CMakeFiles\app.dir\build.make:78: CMakeFiles/app.dir/src/main.c.obj] Error 1 # # —— 诊断 B:include 路径给了、但库没链接 —— # 现象:编译通过、链接期报 undefined reference(给 app 单独加了 target_include_directories(app PRIVATE lib)) # 真实报错(cmake --build build 输出节选): # .../ld.exe: CMakeFiles\app.dir/objects.a(main.c.obj):main.c:(.text+0x13): undefined reference to \`square' # collect2.exe: error: ld returned 1 exit status # # 修复:补 target_link_libraries(app PRIVATE mymath) 后重新配置+构建即可(ex2 完整工程已含该行)