CMake Practice 随笔

一、CMake指令

  • PROJECT

PROJECT(projectname [CXX] [C] [Java])

  定义工程名称,并指定工程支持的语言。支持的语言列表是可以忽略的,默认情况下表示支持所有语言。

  这个指令隐式的定义了两个cmake变量:<projectname>_BINARY_DIR以及<projectname>_SOURCE_DIR。当采用内部编译时,两个变量所指的都是工程所在路径。

  同时,cmake系统也预定义了PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR变量,他们的值分别跟<projectname>_BINARY_DIR和<projectname>_SOURCE_DIR一致。

  • SET

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

  可以用来显式的定义变量。

  • MESSAGE

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display " ...)

  用于向终端输出用户定义的信息,包含三种类型:

  SEND_ERROR, 产生错误,生成过程被跳过;

  STATUS, 输出前缀为--的信息;

  FATAL_ERROR, 立即终止所有cmake过程。

  • ADD_EXECUTABLE

ADD_EXECUTABLE(exename ${SRC_LIST})

    生成一个文件名为hello的可执行文件,相关的源文件时SRC_LIST中定义的源文件列表。

  ${}用来引用变量。

  • ADD_SUBDIRECTORY

ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

   这个指令用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放位置。EXCLUDE_FROM_ALL参数的含义是将这个目录从编译过程中排除。

  可以通过SET指令重新定义EXECUTABLE_OUTPUT_PATH和LIBRARY_OUTPUT_PATH变量来指定最终的目标二进制的位置(指最终生成的目标文件或者最终的共享库,不包含编译生成的中间文件)

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

   如果是外部编译,那可执行二进制的输出路径为build/bin,库的输出路径为build/lib。

  • INSTALL

INSTALL(TARGETS target ...
    [[ARCHIVE|LIBRARY|RUNTIME]
        [DESTINATION <dir>]
        [PERMISSIONS permissions ...]
        [CONFIGURATIONS
    [Debug|Release|...]]
        [COMPONENT <component>]
        [OPTIONAL]
       ] [...])

  参数中的TARGETS后面跟的就是我们通过ADD_EXECUTABLE或者ADD_LIBRARY定义的目标文件,可能是可执行二进制、动态库、静态库。

  目标类型也就相对应的有三种,ARCHIVE特指静态库,LIBRARY特指动态库,RUNTIME特指可执行目标二进制。

  DESTINATION定义了安装的路径,安装后的路径为${CMAKE_INSTALL_PREFIX}/<DESTINATION定义的路径>。需要注意的是,如果路径以 / 开头,那么特指的是绝对路径,这时候CMAKE_INSTALL_PREFIX其实就无效了。

  举个例子:

INSTALL(TARGETS myrun mylib mystaticlib
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION libstatic
    )

  将:

    可执行二进制myrun安装到${CMAKE_INSTALL_PREFIX}/bin目录

    动态库mylib安装到${CMAKE_INSTALL_PREFIX}/lib目录

    静态库mystaticlib安装到${CMAKE_INSTALL_PREFIX}/libstatic目录

  改写好CMakeLists.txt文件后,在终端执行指令

cmake -DCMAKE_INSTALL_PREFIX=/usr .
make
make install

  即可进行编译安装,安装路径为/usr,若不指定,默认路径为/usr/local

  • ADD_LIBRARY

ADD_LIBRARY(libname    [SHARED|STATIC|MODULE]
    [EXCLUDE_FROM_ALL]
        source1 source2 ... sourceN)

  参数libname不需要写全,例如只需填写hello,cmake系统会自动生成libhello.X

  库的类型有三种:SHARED——动态库、STATIC——静态库、MODULE——在使用dyld的系统有效

  EXCLUDE_FROM_ALL参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。

  • INCLUDE_DIRECTORIES

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)

  用于向工程添加多个特定的头文件搜索路径。  

  参数[AFTER|BEFORE]表示添加到当前的头文件搜索路径之后或之前,默认为AFTER。

  • LINK_DIRECTORIES

LINK_DIRECTORIES(directory1 directory2 ...)

  添加非标准的共享库搜索路径。

  • TARGET_LINK_LIBRARIES  

TARGET_LINK_LIBRARIES(target library1 <debug | optimized> library2 ...)

  为target添加需要链接的共享库,target可以是一个可执行文件,也可以是共享库。

原文地址:https://www.cnblogs.com/didada/p/12293219.html