什么是cmake
当编译源文件多的时候使用makefile脚本来自动编译程序,但当源文件特别多的时候,手写makefile 同样是很难的事情,于是有了cmake ,他通过cmakelist.txt 文件管理项目文件。使用cmake .
命令可以使项目生成特定平台的makefile 。
编译流程:
- 编写CMake 配置文件 CMakeLists.txt
- 执行命令
cmake PATH
生成 Makefile 。其中PATH
是CMakeLists.txt 的目录 - 使用
make
命令进行编译 额外的
sudo make install
命令可以对编译的头文件和库文件安装进系统基本格式
# cmake版本声明要求
CMAKE_MINIMUM_REQUIRED(VERSION 3.15)
# 指定项目名
PROJECT(my_lib_test)
# 指定语言要求,以下命令为c++ 11
SET(CMAKE_CXX_STANDARD 11)
# 指定生成二进制文件名称及源文件
ADD_EXECUTABLE(test main.cpp)
# 指定生成静态链接库名称及源文件,该语句与上一语句通常不在一个文件中
ADD_LIBRARY(mathfunc math.cpp)
进阶命令
补充知识:
- 静态库:程序编译阶段就被拷贝到目标文件中,执行时不在需要原始的静态库文件。后缀
.a
.lib
动态库: 程序运行阶段才会调用系统中的动态库。后缀
.so
.dll
# 添加头文件目录,相当与g++ 选项中的 -I (大写i),可连续添加多个,用空格隔开 include_directories(../fmt/include ../math/include) # 添加要链接的动/静态库文件搜索目录,相当于g++ 选项中的 -L,可连续添加多个,用空格隔开 link_directories("/opt/MATLAB/R2012a/bin/glnxa64") # 添加要链接的库文件,可连续添加多个,用空格隔开 link_libraries("/home/kk/dd/lib/libfmt.a") # 全路径添加库文件 # 在当前库文件搜索目录搜索并添加库文件,相当于g++ 中的选项 -l (小写L) target_link_libraries(test fmt) # test 为目标文件,fmt 全名为 libfmt.a /libfmt.so target_link_libraries(test libfmt.a) # 可指定添加静态库 # 查找当前目录下的所有源文件,并将名称全部保存到DIR_SRCS 变量 #此时,就可以用 ${DIR_SRCS} 来代替多个源文件名称了 aux_source_directory( . DIR_SRCS) # 添加子目录,子目录文件中也会包含 cmakelists.txt 文件,其会执行子目录的cmake命令 add_subdirectory(math)
高级命令
# 在cmake 的add_library,add_executable和add_subdirectory等命令有一个EXCLUDE_FROM_ALL参数。根据cmake官网的解释这个参数的作用就是:如果某个target或subdirectory被设置为EXCLUDE_FROM_ALL属性,那么这个target(或这个subdirectory中的所有target)就会被排除在all target列表之外,这样当执行默认的make(或nmake)时,这个target(或这个subdirectory中的所有target)就不会被编译。
add_subdirectory(fmt exclude_from_all)