cmake基础知识

81 阅读2分钟

基本命令

基本构建命令

# 读取CMakeLists.txt,生成build/MakeFile
cmake -B build 
# 根据makefile,编译整个项目
cmake --build build

其他linux命令

# 查看库的链接
ldd

分为静态库(lib)和动态库(windows下的dll文件,linux下的so文件)

库的查找

image.png

创建动态库和静态库

注意:静态库和动态库都是将某些cpp文件编译到一起

# 动态库
add_library(lib SHARED xxx.cpp xxx.cpp)
# 静态库(最好用这个)
add_library(lib STATIC xxx.cpp xxx.cpp)

使用库

# lib是上文的静态库和动态库的生成的名字 lib
target_link_libraries(main PUBLIC lib)

第三方库和头文件

  1. 一开始的c语言并不存在头文件,想要使编译器知道你所使用的是一个函数还是一个类,必须在使用之前,进行声明,然后编译的时候编译器再去找库里面的定义
  2. 这样会很麻烦,毕竟在每一个文件使用的时候都需要声明,改起来会很麻烦
  3. 这时候就出现了预编译器(现在已经整合进入了编译器里面),它是用来处理#include的,把.h文件复制进来,进行了声明,想要修改只用修改一次就行了
  4. 第三方库里面包含两个部分,一个是库.so(.dll),另一个就是.h文件了

cmake中的子模块

如何加载子模块

# root directory
## 这个条命令就像函数调用一样,会进入到子模块里面运行子模块配置,然后再返回
add_subdirectory(DIR)
## 库名是在子CMakelist定义的库名
target_link_libraries(main PUBLIC DIR)

# child directory
## 子模块定义的库
add_library(lib STATIC xxx.cpp xxx.cpp)
## 子模块定义的的头文件,使用这个库的文件可以直接通过#include<file.h>直接使用
## PUBLIC是别的文件可以使用,PRIVATE是只能在当前的子模块项目中使用
target_include_directory(lib PUBLIC pathToHead)

第三方库

在项目目录下git clone完成库的源代码 在root的cmakelist里面add_subdirectory和target_link_library就可以了,头文件已经在子模块定义了

其他命令

添加宏定义


target_add_definitions(main PUBLIC MY_MACRO=1)

image.png target_compile_options 这个相当于 g++ -fopenmp include_directories 小彭老师说仅头文件的第三方库用这个命令