基本命令
基本构建命令
# 读取CMakeLists.txt,生成build/MakeFile
cmake -B build
# 根据makefile,编译整个项目
cmake --build build
其他linux命令
# 查看库的链接
ldd
库
分为静态库(lib)和动态库(windows下的dll文件,linux下的so文件)
库的查找
创建动态库和静态库
注意:静态库和动态库都是将某些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)
第三方库和头文件
- 一开始的c语言并不存在头文件,想要使编译器知道你所使用的是一个函数还是一个类,必须在使用之前,进行声明,然后编译的时候编译器再去找库里面的定义
- 这样会很麻烦,毕竟在每一个文件使用的时候都需要声明,改起来会很麻烦
- 这时候就出现了预编译器(现在已经整合进入了编译器里面),它是用来处理#include的,把.h文件复制进来,进行了声明,想要修改只用修改一次就行了
- 第三方库里面包含两个部分,一个是库.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)
target_compile_options 这个相当于
g++ -fopenmp
include_directories 小彭老师说仅头文件的第三方库用这个命令