0%

CMake语法小结

基础语法

关键字

PROJECT关键字

PROJECT(name)指定工程名称, 默认支持所有语言

PROJECT(name CXX)指定工程名称, 支持C++

会隐式定义两个变量

  • ${name}_BINARY_DIR
  • ${name}_SOURCE_DIR

修改工程名时会将这两个变量修改,可通过预定义两个变量PROJECT_BINARY_DIR以及PROJECT_SOURCE_DIR解决该问题

SET关键字

设定值,SET(SRC_LIST main.cpp a.cpp b.cpp),即设定了SEC_LIST的值

MESSAGE关键字

输出自定义的信息,主要有三种

  • SEND_ERROR,产生错误生成过程被跳过
  • STAUS,显示普通的消息
  • FATAL_ERROR,终止cmake过程

ADD_EXECUTABLE

生成可执行文件ADD_EXECUTABLE(target src)

ADD_SUBDIRECTORY

  • 添加存放源文件的子目录,并可指定中间二进制与目标二进制的存放位置
  • EXECULDE_FORM_ALL可将参数从编译中排除
  • ADD_SUBDIRECTORY(src bin)
    • 将src目录加入工程并指定编译输出(包含中间结果)路径为bin目录
    • 如果不进行 bin 目录指定, 那编译结果(包含中间文件)将会存放在指定的 执行cmake命令目录下的src

关于更改二进制保存路径

  • SET(EXECUTABLE_OUTPUT_PATH $(PROJECT_BINARY_DIR)/bin)
  • SET(LIBRARY_OUTPUT_PATH $(PROJECT_BINARY_DIR)/lib)

原则

  1. 变量使用${}取值,但在 IF 语句中直接使用变量名
  2. 指令中的参数需使用()括起来,参数之间使用空格或分号分隔
  3. 指令大小写无关
  4. 如果参数中包含空格,则需要将参数使用双引号包括

安装

INSTALL:安装指令,包括二进制,动态库,静态库以及文件,目录,脚本等

CMAKE_INSTALL_PREFIX:—prefix

  • 安装文件:INSTALL(FILES file1 file2 DESTINATION dst_dir),将file1以及file2安装到dest_dir中,其中FILES为文件,DESTINATION一般为:
    • 绝对路径
    • 相对路径,即为${CMAKE_INSTALL_PREFIX}/${DESTINATION}CMAKE_INSTALL_PREFIX一般默认为/usr/local/,可使用cmake -DCMAKE_INSTALL_PREFIX=/usr指定该变量的值
  • 安装脚本:INSTALL(PROGRAMS abc.sh bin)PROGRAMS 为非目标文件的可执行程序安装
  • 安装目录:
    • 直接在需要安装的目录内创建CMakeList.txt,在其内写INSTALL file
    • INSTALL(DIRECTORY dir/ DESTINATION dst_dir):若为dir/则表示将dir目录下所有内容安装到dst_dir下,若为dir则表示将dir目录本身安装到dst_dir
  • 安装库文件:INSTALL(TARGET bin_name lib_name_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib),安装二进制,静态或动态库均需要使用TARGETARCHIVE特指静态库,LIBRARY特指动态库,RUNTIME特指可执行的目标二进制

构建静态库与动态库

ADD_LIBRARY(lib_name SHARED ${LIB_SRC})

  • lib_name:库名称
  • SHARED:表示生成动态库,STATIC表示生成静态库
  • LIB_SRC:源文件

同时构建静态库与动态库的方式:

  1. 使用两个名字,例如

    • ADD_LIBRARY(lib_name SHARED ${LIB_SRC})
    • ADD_LIBRARY(lib_name_static STATIC ${LIB_SRC})
  2. 使用SET_TARGET_PROPERTIES,设置输出名称

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SET(LIB_NAME_SRC lib_src.cpp)
    ADD_LIBRARY(lib_name_static STATIC ${LIBNAME_SRC})

    //重命名lib_name_static为lib_name
    SET_TARGET_PROPETIES(lib_name_static PROPETIES OUTPUT "lib_name")
    //在构建新的目标时,会尝试清理掉其他使用使用这个名称的库,例如构建lib_name.so时会清除掉lib_name.a
    SET_TARGET_PROPETIES(lib_name_static PROPETIES CLEAN_DIRECT_OUTPUT 1)

    ADD_LIBRARY(lib_name SHARED ${LIBNAME_SRC})

    SET_TARGET_PROPETIES(lib_name PROPETIES OUTPUT "lib_name")
    SET_TARGET_PROPETIES(lib_name PROPETIES CLEAN_DIRECT_OUTPUT 1)

动态库版本号设定

SET_TARGET_PROPERTIES(lib_name PROPERTIES VERSION 1.2 SOVERSION 1),其中:

  • VERSION:动态库版本
  • SOVERSION:API版本

使用外部共享库和头文件

INCLUDE_DIRECTORIES(head_path),指定头文件路径

LINK_DIRECTORIES(lib_path),指定库路径

TARGET_LINK_LIBRARIES(bin_name lib_name),指定二进制lib_name要链接的库文件

常见环境变量

  • CMAKE_INCLUDE_PATH,头文件路径
  • CMAKE_LIBRARY_PATH,库文件路径
  • CMAKE_BUILD_TYPE,release or debug等
-------------本文结束感谢您的阅读-------------