什么是cmake

当编译源文件多的时候使用makefile脚本来自动编译程序,但当源文件特别多的时候,手写makefile 同样是很难的事情,于是有了cmake ,他通过cmakelist.txt 文件管理项目文件。使用cmake . 命令可以使项目生成特定平台的makefile 。
编译流程:

  1. 编写CMake 配置文件 CMakeLists.txt
  2. 执行命令 cmake PATH 生成 Makefile 。其中 PATH 是CMakeLists.txt 的目录
  3. 使用 make 命令进行编译
  4. 额外的 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)

进阶命令

补充知识:

  1. 静态库:程序编译阶段就被拷贝到目标文件中,执行时不在需要原始的静态库文件。后缀 .a .lib
  2. 动态库: 程序运行阶段才会调用系统中的动态库。后缀 .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)
最后修改:2020 年 04 月 13 日
如果觉得我的文章对你有用,请随意赞赏