CMake 基本用法

本文介绍CMake的基础用法,包括创建基本的CMakeLists文件、添加子目录、使用目标文件的安装方法、添加库文件及如何链接外部共享库和头文件等内容。
1. 最基本的CMakeLists 文件
# 它将 main.c 编译为 hello 的可执行文件
PROJECT (HELLO)    # 项目名称
SET(SRC_LIST main.c)   # 源文件
ADD_EXECUTABLE(hello ${SRC_LIST})  # 可执行文件

Cmake 是强烈推荐外部编译的,内部编译会生成一些无法自动删除的中间文件。使用 cmake [CMakeLists.txt path] 进行编译,会生成Makefile等文件,在此执行 make, 即可生成可执行文件。

2. 添加子文件

可以使用ADD_SUBDIRECROTY(source_dir [binary_dir][EXCLUDE_FROM_ALL])来添加下一层的 CMakeLists.txt, 并指定目录.


ADD_SUBDIRECTORY(src bin) # 将 src目录编译为 bin 目录

另外可以都可以通过 SET 指令重新定义 EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 变量来指定最终的目标二进制的位置(指最终生成的 hello 或者最终的共享库,不包含编译生成的中间文件)

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
3. 使用目标文件的安装:
  • 目标文件的安装

    INSTALL(TARGETS myrun mylib mystaticlib
       RUNTIME DESTINATION bin  # 可执行二进制库
       LIBRARY DESTINATION lib  # 动态库
       ARCHIVE DESTINATION libstatic  # 静态库
    )
  • 普通文件的安装

    INSTALL(FILES README DESTINATION share)
  • 目录的安装

    INSTALL(DIRECTORY icons scripts/ DESTINATION share/myproj)  
    
    # icons 文件夹 scripts 目录下的所有文件
    

如果你要直接安装到系统,可以使用如下指令:

cmake -DCMAKE_INSTALL_PREFIX=/usr ..
4. 添加库
   ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
   # SHARED,动态库
   # STATIC,静态库
   # MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待
   # 更新库版本号
   SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1) 
   # VERSION 指代动态库版本,SOVERSION 指代 API 版本
5. 使用外部共享库和头文件
INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...) # 添加头文件包含路径
TARGET_LINK_LIBRARIES(target library1 library2...) # 为 target 添加共享库
6. 其它
  • 设置最小的CMake 版本

    cmake_minimum_required(VERSION 3.1.0)
  • 限定使用 C++11

    
    # Use C++11
    
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    message(STATUS "C++11 support has been enabled by default.")
  • 常见的变量

    CMAKE_CURRENT_SOURCE_DIR  # 当前 CMakeLists 所在路径

<think>我们正在学习如何编写一个基本CMake项目。根据引用内容,我们可以总结出CMake基本使用流程和关键概念。 目标:创建一个基本CMake项目,包含以下步骤: 1. 创建项目目录和源文件 2. 编写CMakeLists.txt文件 3. 配置项目(生成构建系统) 4. 构建项目(编译) 5. 运行可执行文件 下面我们以一个简单的“Hello World”项目为例。 步骤1:创建项目结构 假设项目名为`hello_cmake`,目录结构如下: ``` hello_cmake/ ├── CMakeLists.txt # CMake配置文件 └── src/ └── main.cpp # 源代码 ``` 步骤2:编写源代码(main.cpp) ```cpp #include <iostream> int main() { std::cout << "Hello, CMake!" << std::endl; return 0; } ``` 步骤3:编写CMakeLists.txt 在项目根目录(hello_cmake/)下创建CMakeLists.txt文件,内容如下: ```cmake # 设置CMake最低版本要求 cmake_minimum_required(VERSION 3.10) # 设置项目名称 project(hello_cmake) # 添加可执行目标:将源文件编译为可执行文件 add_executable(hello_cmake src/main.cpp) ``` 步骤4:配置项目(生成构建系统) 在项目根目录下,创建一个构建目录并进入,然后运行cmake命令: ```bash mkdir build cd build cmake .. ``` 以上命令会生成构建系统(例如Makefile)。 步骤5:构建项目(编译) 在build目录下运行构建命令: ```bash cmake --build . # 使用CMake进行构建(跨平台) # 或者使用生成的构建系统(如make) make ``` 步骤6:运行程序 在build目录下运行生成的可执行文件: ```bash ./hello_cmake ``` 输出:`Hello, CMake!` 补充说明: 1. 引用[4]中提供了更简洁的命令: - `cmake -B build`:直接在项目根目录下创建build目录并生成构建系统(无需手动创建build目录) - `cmake --build build -j4`:构建项目,使用4个并行任务 2. 关于CMakeLists.txt的说明: - `cmake_minimum_required`:指定CMake的最低版本,确保兼容性。 - `project(hello_cmake)`:设置项目名称,同时会定义一些变量,如`PROJECT_NAME`。 - `add_executable(target_name source_files)`:指定从源文件生成可执行文件。 3. 引用[3]提到CMake的特点:跨平台,可生成多种构建系统(如Makefile、Visual Studio工程等)。 4. 引用[1]和[2]介绍了CMake基本流程和编写CMakeLists.txt的简单示例。 5. 引用[5]提到了安装(make install)和测试(make test)的功能,但本示例暂不涉及。 通过以上步骤,我们就完成了一个最基本CMake项目。 注意:在实际项目中,我们可能还需要设置C++标准、添加头文件路径、链接库等,这些可以在后续学习中逐步掌握。 为了巩固学习,可以尝试以下扩展: 1. 在项目中添加多个源文件(如`src/hello.cpp`和`src/hello.h`),并在`main.cpp`中包含头文件,然后修改CMakeLists.txt以包含新的源文件。 2. 设置C++标准:在CMakeLists.txt中添加`set(CMAKE_CXX_STANDARD 11)`(或其他标准)来指定C++版本。 参考文献: [^1]: 初识CMake,如何编写一个CMake工程(上) [^2]: 如何编写一个cmake [^3]: CMake基础教程(1)什么是cmake [^4]: 用法 cmake -B build [^5]: 初识CMake,如何编写一个CMake工程(下)</think>### CMake基础教程:如何编写一个基本CMake项目 #### 一、CMake核心概念 1. **CMake是什么** - 跨平台构建工具,可生成Makefile、Visual Studio工程等[^3] - 通过`CMakeLists.txt`文件描述项目构建规则 - 工作流程:`CMakeLists.txt` → 生成构建文件 → 编译项目[^2] 2. **关键文件** | 文件类型 | 作用 | 示例位置 | |------------------|-------------------------------|---------------| | `CMakeLists.txt` | 项目构建规则 | 项目根目录 | | 源文件(.cpp/.h) | 项目源代码 | src目录 | | 构建目录 | 存放生成的构建文件 | build/目录 | #### 二、基础项目搭建步骤 1. **创建项目结构** ```bash my_project/ ├── CMakeLists.txt # CMake配置文件 └── src/ └── main.cpp # C++源代码 ``` 2. **编写最小化CMakeLists.txt** ```cmake # 最低CMake版本要求 cmake_minimum_required(VERSION 3.10) # 设置项目名称和语言 project(MyProject CXX) # 添加可执行文件 add_executable(my_app src/main.cpp) ``` 3. **配置与构建项目** ```bash # 创建构建目录并生成构建文件 cmake -B build # 编译项目(-j4表示4线程并行) cmake --build build -j4 ``` 4. **运行程序** ```bash # Linux/macOS ./build/my_app # Windows .\build\Debug\my_app.exe ``` #### 三、进阶功能示例 1. **添加多个源文件** ```cmake # 查找所有源文件 aux_source_directory(src SOURCES) # 添加可执行文件 add_executable(my_app ${SOURCES}) ``` 2. **设置C++标准** ```cmake set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) ``` 3. **添加头文件路径** ```cmake include_directories(include) # 添加include目录 ``` 4. **安装目标(make install)** ```cmake install(TARGETS my_app RUNTIME DESTINATION bin ) ``` 执行安装:`cmake --install build`[^5] #### 四、项目结构示例(多目录) ``` my_project/ ├── CMakeLists.txt ├── include/ │ └── utils.h ├── src/ │ ├── main.cpp │ └── utils.cpp └── build/ # 自动生成 ``` 对应CMakeLists.txt: ```cmake cmake_minimum_required(VERSION 3.10) project(AdvancedProject) # 包含头文件目录 include_directories(include) # 添加可执行文件 add_executable(app src/main.cpp src/utils.cpp ) # 设置C++标准 target_compile_features(app PRIVATE cxx_std_17) ``` #### 五、常用命令速查 | 命令 | 作用 | |--------------------------|-------------------------------| | `add_executable()` | 创建可执行文件目标 | | `add_library()` | 创建库文件目标 | | `target_link_libraries()`| 链接库到目标 | | `find_package()` | 查找外部依赖包 | | `set()` | 设置变量 | > 最佳实践:始终在`build`目录外构建(out-of-source build)保持源码清洁[^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值