cmake语法小结

cmake小结:

  1. CMakeLists.txt 文件中不区分大小写

  2. PROJECT(project_name) 定义工程名称

    语法:project(projectname [cxx] [c] [java])

    可以指定工程采用的语言,选项分别表示:C++, C, java, 如不指定默认支持所有语言

  3. MESSAGE(STATUS, “Content”) 打印相关消息输出消息,供调试CMakeLists.txt 文件使用。

  4. SET(CMAKE_BUILE_TYPE DEBUG) 设置编译类型debug 或者release。 debug 版会生成相关调试信息,可以使用GDB 进行 调试;release不会生成调试信息。当无法进行调试时查看此处是否设置为debug.

  5. SET(CMAKE_C_FLAGS_DEBUG “-g -Wall”) 设置编译器的类型

     CMAKE_C_FLAGS_DEBUG            ----  C 编译器
    
     CMAKE_CXX_FLAGS_DEBUG        ----  C++ 编译器
    
  6. ADD_SUBDIRECTORY(utility) 添加要编译的子目录为工程主目录下的存放源代码的子目录使用该命令,各子目录出现的顺序随意。

  7. SET(SOURCE_FILES …..)

    表示要编译的源文件,所有的源文件都要罗列到此处。set 设置变量,变量名SOURCE_FILES自定义。

  8. INCLUDE_DIRECTORY(…)

    include头文件时搜索的所有目录

    变量PROJECT_SOURCE_DIR 表示工程所在的路径,系统默认的变量

  9. LINK_DIRECTORIES(…)

    库文件存放的目录,在程序连接库文件的时候要再这些目录下寻找对应的库文件

  10. ADD_LIBRARY(…)

    表示生成静态链接库libassociaiton.a,由${PROJECT_SOURCE_DIR}代表的文件生成。

    语法:ADD_LIBRARY(libname [SHARED|STATIC]

    SHARED 表示生成动态库, STATIC表示生成静态库。

  11. TARGET_LINK_LIBRARY(association core)

    表示库association 依赖core库文件

  12. SET_TARGET_PROPERTIES

    设置编译的库文件存放的目录,还可用于其他属性的设置。如不指定,

    生成的执行文件在当前编译目录下的各子目录下的build目录下,好拗口!简单一点:

    如指定在: ./src/lib 下

    不指定在: ./src/build/utility/build 目录下

    生成的中间文件在./src/build/utilty/build 目录下,不受该命令额影响

  13. ADD_EXECUTABLE() #指定要生成的执行文件的名称server

    其他用法同utilty/CMakeLists.txt

  14. SET_TARGET_PROPERTIES

    设置生成的执行文件存放的路径,

    注意:

    执行文件server 依赖的子目录utility 子目录生成的静态库libutility.a,在指定的时候要写成:
    TARGET_LINK_LIBRARIES(server utility)

    而不能写成:

    TARGET_LINK_LIBRARIES(server libutility.a)

    否则编译总会提示找不到libutility库文件。

    但使用第三方的库却要指定成具体的库名,如:libACE-6.0.0.so

    这一点很诡异,暂时还没找到原因。


CMake更多详细用法可参考 《cmake实践》

<think>好的,用户想了解CMake语法和使用方法,我需要提供一个教程和示例。首先,我应该从基础开始,比如CMake的基本结构,常用的命令,变量设置,控制结构,生成可执行文件和库,链接库,安装规则,模块使用,以及环境变量处理。同时,结合用户提供的引用内容,我需要确保覆盖到Cache变量、Find模块、add_subdirectory等部分。 用户提供的引用里提到CMakeCache.txt、环境变量ENV{VAR}、Find<NAME>模块的使用,以及add_subdirectory的作用。这些内容需要整合到回答中。例如,在讲解变量时,要区分普通变量和Cache变量,并说明CMakeCache.txt的作用。在模块部分,可以提到find_package和如何编写Find模块,引用中的例子显示找不到库时的错误,可以用来举例说明Find模块的重要性。 另外,用户可能需要具体的示例来理解语法,所以提供代码示例是必要的。比如,一个简单的CMakeLists.txt文件,包含项目声明、添加可执行文件、链接库等步骤。同时,结合用户之前的问题,确保示例正确使用变量和模块。 还要注意用户提到的系统级指令,比如数学公式的格式,但这里主要是代码和命令,可能不需要数学公式。但需要确保代码块使用正确的格式,如```cmake。 最后,生成相关问题时要围绕CMake的常见问题,比如变量作用域、Cache变量与普通变量的区别,如何编写Find模块,处理依赖关系等,参考用户提供的引用内容中的主题。</think>以下为CMake语法及使用方法的详细教程,包含基础语法、核心功能和应用示例: 一、CMake基础语法结构 1. 命令格式:`命令名(参数1 参数2...)` 2. 变量使用:`${变量名}` 3. 注释:`# 单行注释` 4. 环境变量访问:`$ENV{变量名}`[^1] 二、核心命令及示例 1. 项目定义: ```cmake cmake_minimum_required(VERSION 3.10) project(MyProject LANGUAGES CXX) ``` 2. 生成可执行文件: ```cmake add_executable(myapp main.cpp utils.cpp) ``` 3. 创建库文件: ```cmake add_library(mylib STATIC libsrc.cpp) # 静态库 add_library(mylib SHARED libsrc.cpp) # 动态库 ``` 4. 包含目录: ```cmake include_directories(${PROJECT_SOURCE_DIR}/include) ``` 5. 链接库文件: ```cmake target_link_libraries(myapp PRIVATE mylib) ``` 三、变量管理 1. 普通变量: ```cmake set(MY_VAR "value") # 当前作用域有效 ``` 2. Cache变量(全局有效): ```cmake set(MY_CACHE_VAR "default" CACHE STRING "说明文档") ``` 所有Cache变量存储在`CMakeCache.txt`中[^1] 四、控制结构 1. 条件判断: ```cmake if(CMAKE_SYSTEM_NAME STREQUAL "Linux") # Linux特定设置 elseif(WIN32) # Windows设置 endif() ``` 2. 循环结构: ```cmake foreach(file IN ITEMS file1.cpp file2.cpp) message("Processing: ${file}") endforeach() ``` 五、模块化开发 1. 添加子目录: ```cmake add_subdirectory(src) # 处理src/CMakeLists.txt[^3] ``` 2. 查找依赖库: ```cmake find_package(OpenCV REQUIRED) # 自动查找OpenCV配置 target_link_libraries(myapp ${OpenCV_LIBS}) ``` 六、完整示例 项目结构: ``` project/ ├── CMakeLists.txt ├── include/ │ └── utils.h └── src/ ├── main.cpp └── utils.cpp ``` CMakeLists.txt内容: ```cmake cmake_minimum_required(VERSION 3.10) project(MyDemo LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) # 设置C++标准 include_directories(include) add_subdirectory(src) # 主程序 add_executable(demo src/main.cpp src/utils.cpp) target_link_libraries(demo PRIVATE mylib) # 安装规则 install(TARGETS demo DESTINATION bin) ``` 七、常用技巧 1. 消息输出: ```cmake message(STATUS "当前构建类型:${CMAKE_BUILD_TYPE}") ``` 2. 环境变量读取: ```cmake message("用户PATH环境变量:$ENV{PATH}")[^1] ``` 3. 生成器表达式: ```cmake target_compile_options(mylib PRIVATE "$<$<CONFIG:Release>:-O3>") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值