zoukankan      html  css  js  c++  java
  • 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可以是一个可执行文件,也可以是共享库。

  • 相关阅读:
    STL的移动算法
    mysql insert和前台显示乱码
    垃圾回收算法简单介绍——JVM读书笔记&lt;二&gt;
    UVA
    读取系统执行状态的shell脚本
    【web 回车】web项目 注册或登录页面 回车登录无效,解决方案
    【maven】maven项目移除Maven Dependencies后如何再添加进去
    【web.xml】报错java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
    【shiro】关于shiro匹配URL的小用法
    【Sets】使用Google Guava工程中Sets工具包,实现集合的并集/交集/补集/差集
  • 原文地址:https://www.cnblogs.com/didada/p/12293219.html
Copyright © 2011-2022 走看看