CMake的使用

Posted by LemonWhale on May 13, 2024

一、只有一个源文件的程序编译

  • 创建文件CMakeLists.txt ```Cpp // CMake最低的版本要求 cmake_minimum_required(VERSION 2.8)、

//本项目的工程名 project(test)

//第一个变量:要生成的可执行文件名为hello,后边的参数是需要的依赖 add_executable(hello hello.cpp)


#### 二、同一目录下多个源文件
如果当前目录新增了两个依赖`add.cpp`和`add.h`,只需要在`CMakeLists.txt`中添加所依赖的`.cpp`文件,编译步骤和上面相同。
```Cpp
// CMake最低的版本要求
cmake_minimum_required(VERSION 2.8)、

//本项目的工程名
project(test)

//第一个变量:要生成的可执行文件名为hello,后边的参数是需要的依赖
add_executable(hello hello.cpp add.cpp)

三、同一目录下很多源文件

如果一个目录下的源文件过多,一个一个添加会很慢,可以使用cmake中的函数来存储这些文件:
aux_source_directory(dir var)
作用是把dir目录下的所有源文件都添加到var变量中,然后用到源文件的地方使用var代替。

// CMake最低的版本要求
cmake_minimum_required(VERSION 2.8)、

//本项目的工程名
project(test)

//将目录中的源文件存到变量中
aux_source_directory(. SRC_LIST)

//第一个变量:要生成的可执行文件名为hello,后边的参数是需要的依赖
add_executable(hello ${SRC_LIST})

四、头文件的引入

对于集中的头文件,Cmake提供了一个函数:include_directories(dir)。作用是自动在dir目录下寻找头文件,相当gcc -l dir,此时CmakeLists.txt的写法为:

// CMake最低的版本要求
cmake_minimum_required(VERSION 2.8)、

//本项目的工程名
project(test)

//将目录中的源文件存到变量中
aux_source_directory(. SRC_LIST)

//包含头文件
include_directories(path/to/inc)

//第一个变量:要生成的可执行文件名为hello,后边的参数是需要的依赖
add_executable(hello ${SRC_LIST})

五、头文件和源文件在多个文件夹

// CMake最低的版本要求
cmake_minimum_required(VERSION 2.8)、

//本项目的工程名
project(test)

//包含头文件
include_directories(path/to/inc_dir1 path/to/inc_dir2)

//将目录中的源文件存到变量中
aux_source_directory(src_dir1 SRC_LIST1)
aux_source_directory(src_dir2 SRC_LIST2)
aux_source_directory(main_dir MAIN_DIR)

//第一个变量:要生成的可执行文件名为hello,后边的参数是需要的依赖
add_executable(hello ${SRC_LIST1} ${SRC_LIST1} ${MAIN_DIR})

六、生成动态库和静态库

假如说现在的项目目录如下:

  • inc目录下放头文件
  • src目录下放源文件
  • lib目录下放生成的库
  • build目录下存放构建项目相关的文件,如CMakeLists.txt ```Cpp // 最低版本号 cmake_minimum_required(VERSION 3.0)

// 项目名称 project(test)

// 整合源文件 aux_source_directory(${PROJECT_BINARY_DIR}/../src SRC_LIST)

// 引入头文件 include_directories(${PROJECT_BINARY_DIR}/../inc)

// 生成静态库或动态库 // 参数一:生成的库的名称;参数二:静态或动态;参数三:生成所需的文件 add_library(func_shared SHARED ${SRC_LIST}) add_library(func_static STATIC ${SRC_LIST})

// 设置最终生成的库名称,这里把库名称统一为myfunc set_target_properties(func_shared PROPERTIES OUTPUT_NAME “myfunc”) set_target_properties(func_static PROPERTIES OUTPUT_NAME “myfunc”)

// 设置库默认生成路径 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/../lib)

- `PROJECT_BINARY_DIR`是cmake系统变量,意思是执行cmake命令的目录,我们计划在`build`目录下执行`cmake`命令,所以这个变量也就等同于`build`目录;
- `set_target_properties`重新定义了库的输出名称,如果不使用`set_target_properties`也可以,那么库的名称就是`add_library`里定义的名称;
- `LIBRARY_OUTPUT_PATH`是`cmake`系统变量,项目生成的库文件都放在这个目录下,这里指定库生成到`lib`目录。
#### 七、链接库文件
**我们已经在`lib`目录下生成了库文件,下面是一个main函数来使用库文件**
- `lib`目录下存放静态库和动态库
- `main_src`目录下存放main函数相关的源文件
- `bin`目录下存放项目生成的可执行文件
```Cpp
// 最低版本号
cmake_minimum_required(Version 3.0)

// 项目名称
project(test)

// 整合源文件
aux_source_directory(${PROJECT_BINARY_DIR}/../main_src MAIN_SRC)

// 引入头文件路径
include_directories(${PROJECT_BINARY_DIR}/../inc)

// 查找库文件,第二个参数:要查找的库文件,第三个参数:要在哪个目录下查找
// 第一个参数:是一个变量,用于储存查找到的库文件
find_library(FUNC_LIB myfunc ${PROJECT_BINARY_DIR}/../bin)

// 把库链接到可执行文件中
target_link_libararies(test  ${FUNC_LIB})