跳到主要内容
🔍

代码示例: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 完整工程已含该行)