当前位置:   article > 正文

[C/C++] -- CMake使用

[C/C++] -- CMake使用

CMake(Cross-platform Make)是一个开源的跨平台构建工具,用于自动生成用于不同操作系统和编译器的构建脚本。它可以简化项目的构建过程,使得开发人员能够更方便地管理代码、依赖项和构建设置。

CMake 使用一个名为 CMakeLists.txt 的配置文件来描述项目的构建过程。在 CMakeLists.txt 文件中,可以指定项目的源代码文件、依赖项以及构建选项等信息。然后,CMake 会根据这些信息生成对应平台的构建脚本(如 Makefile 或 Visual Studio 项目文件),从而完成项目的构建过程。

1.下载安装

  1. Windows

    • 在 CMake 官方网站 上下载 Windows 版本的安装程序。
    • 运行安装程序,按照提示进行安装。
  2. macOS

    • 可以使用 Homebrew 进行安装,命令为 brew install cmake
  3. Linux

    • 在大多数 Linux 发行版的软件仓库中都可以找到 CMake,可以使用系统自带的软件包管理器进行安装,比如:
      • Ubuntu/Debian:sudo apt install cmake
      • Fedora:sudo dnf install cmake
      • CentOS:sudo yum install cmake

2.CMake使用介绍

1. 创建项目目录结构

假设你有以下项目目录结构:

  1. project/
  2. |- src/
  3. |- main.cpp
  4. |- helper.cpp
  5. |- include/
  6. |- helper.h
  7. |- CMakeLists.txt

2. 编辑 CMakeLists.txt 文件

在项目根目录下创建一个 CMakeLists.txt 文件,并添加以下内容:

  1. cmake_minimum_required(VERSION 3.10)
  2. project(MyProject)
  3. # 添加可执行文件
  4. add_executable(my_executable src/main.cpp src/helper.cpp)
  5. # 添加头文件路径
  6. target_include_directories(my_executable PUBLIC include)

3. 生成构建系统

在项目根目录下创建一个 build 目录,进入该目录,并运行以下命令生成构建系统:

cmake ..

4. 构建项目

根据生成的构建系统进行构建操作,比如使用 make 命令(如果是在 Linux/macOS):

make

5. 运行程序

构建成功后,在 build 目录下会生成可执行文件,你可以运行它:

./my_executable

其他常见用法

  • 指定编译选项:
target_compile_options(my_executable PRIVATE -Wall -Wextra)
  • 添加库文件依赖:
  1. find_package(SomeLibrary REQUIRED)
  2. target_link_libraries(my_executable PRIVATE SomeLibrary::SomeLibrary)

3.使用示例

  • 基本的 CMakeLists.txt 配置文件

cmake命令会执行目录下的CMakeLists.txt配置文件里面的配置项

  1. cmake_minimum_required (VERSION 2.8) #要求cmake最低的版本号
  2. project (demo) # 定义当前工程名字
  3. set(CMAKE_BUILD_TYPE "Debug")#设置debug模式,如果没有这一行将不能调试设断点
  4. set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g)
  5. add_executable(main main.c)
  6. #进入子目录下执行 CMakeLists.txt文件 这里的lib和tests里面都有可编译的代码文件
  7. add_subdirectory(lib)
  8. add_subdirectory(tests)

整个流程

生成一个main.cpp源文件,输出"hello world",然后在同级目录创建一个CMakeLists.txt文件

1.test.cpp

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. cout <<"Hello World!"<< endl;
  6. return 0;
  7. }

2.CMakeLists.txt

  1. cmake_minimum_required (VERSION 2.8) #要求cmake最低的版本号
  2. project (TestCMake) # 定义当前工程名字
  3. set(CMAKE_BUILD_TYPE "Debug")#设置debug模式,如果没有这一行将不能调试设断点
  4. add_executable(main test.cpp)

3.执行cmake .命令

产生了CMake的一些中间文件和Makefile文件

Makefile里面实现了clean,所以使用make clean可以清除生成的文件,然后重新编译源码。

4.make编译,生成最终可执行文件

源文件处理

如果需要编译的有多个源文件,可以都添加到add_executable(main main.cpp test.cpp)列表当中, 但是如果源文件太多,一个个添加到add_executable的源文件列表中,就太麻烦了,此时可以用 aux_source_directory(dir var)来定义源文件列表,使用如下:

  1. cmake_minimum_required (VERSION 2.8)
  2. project (demo)
  3. aux_source_directory(. SRC_LIST) # 定义变量,存储当前目录下的所有源文件
  4. add_executable(main ${SRC_LIST})

aux_source_directory()会把指定目录下的所有源文件都加进来,可能会加入一些我们 不需要的文件,此时我们可以使用set命令去新建变量来存放需要的源文件,如下

  1. cmake_minimum_required (VERSION 2.8)
  2. project (demo)
  3. set( SRC_LIST
  4. ./main.cpp
  5. ./test.cpp)
  6. add_executable(main ${SRC_LIST})

正式工程构建

一个正式的源码工程应该有这几个目录:

-bin                    存放最终的可执行文件

-build                 存放编译中间文件

-include             头文件

        --test.h

-src                    源代码文件

        --test.cpp

main.cpp

-CMakeLists.txt

CMakeLists.txt如下:

  1. cmake_minimum_required (VERSION 2.8)
  2. project (math)
  3. # 设置cmake的全局变量
  4. set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
  5. #添加头文件路径,相当于makefile里面的-I
  6. include_directories(${PROJECT_SOURCE_DIR}/include)
  7. aux_source_directory (src SRC_LIST)
  8. add_executable (main main.cpp ${SRC_LIST})

然后在build目录里面执行cmake .. 命令,这样所有的编译中间文件都会在build目录下,最终的可执行 文件会在bin目录里面

然后使用make编译

最终生成的文件在bin目录下

静态库和动态库的编译控制

把上面的test源文件直接生成静态库或者动态库,让外部程序进行链接使用,代码结构如下:

-bin                    存放最终的可执行文件

-build                 存放编译中间文件

-lib                     存放编译生成的库文件

-include             头文件

        --test.h

-src                    源代码文件

        --test.cpp

        --CMakeLists.txt

-test                   测试代码

   --main.cpp

   --CMakeLists.txt

-CMakeLists.txt

最外层的CMakeLists.txt是总控编译:

  1. cmake_minimum_required (VERSION 2.8)
  2. project (cmaketest)
  3. add_subdirectory (test)
  4. add_subdirectory (src)

src里面的源代码要生成静态库或动态库,CMakeLists.txt内容如下:

  1. set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
  2. include_directories (../include)
  3. # 生成库,动态库是SHARED,静态库是STATIC
  4. add_library (test SHARED test.cpp)
  5. # 修改库的名字
  6. #set_target_properties (test PROPERTIES OUTPUT_NAME "libtest")

test里面的CMakeLists.txt内容如下:

  1. set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
  2. include_directories (../include) # 头文件搜索路径
  3. link_directories (${PROJECT_SOURCE_DIR}/lib) # 库文件搜索路径
  4. add_executable (main main.cpp) # 指定生成的可执行文件
  5. target_link_libraries (main test) # 执行可执行文件需要依赖的库

在build目录下执行cmake ..命令,然后执行make,如下

执行编译生成的可执行文件

查看生成的可执行文件,检验其链接的库有哪些

CMake常用的预定义命令

  1. PROJECT_NAME : 通过 project() 指定项目名称
  2. PROJECT_SOURCE_DIR : 工程的根目录
  3. PROJECT_BINARY_DIR : 执行 cmake 命令的目录
  4. CMAKE_CURRENT_SOURCE_DIR : 当前 CMakeList.txt 文件所在的目录
  5. CMAKE_CURRENT_BINARY_DIR : 编译目录,可使用 add subdirectory 来修改
  6. EXECUTABLE_OUTPUT_PATH : 二进制可执行文件输出位置
  7. LIBRARY_OUTPUT_PATH : 库文件输出位置
  8. BUILD_SHARED_LIBS : 默认的库编译方式 ( shared 或 static ) ,默认为 static
  9. CMAKE_C_FLAGS : 设置 C 编译选项
  10. CMAKE_CXX_FLAGS : 设置 C++ 编译选项
  11. CMAKE_CXX_FLAGS_DEBUG : 设置编译类型 Debug 时的编译选项
  12. CMAKE_CXX_FLAGS_RELEASE : 设置编译类型 Release 时的编译选项
  13. CMAKE_GENERATOR : 编译器名称
  14. CMAKE_COMMAND : CMake 可执行文件本身的全路径
  15. CMAKE_BUILD_TYPE : 工程编译生成的版本, Debug / Release
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/90828
推荐阅读
相关标签
  

闽ICP备14008679号