cmake 学习

6 篇文章 0 订阅

  

      要装osg earth, cmake 不会玩,好尴尬。下午看了 cmake 教程(47页)。

  

   -- 几个关键词

     PROJECT (project_name, [CXX] [C] [JAVA])  指定工程名称,及工程支持的语言(可选)

     SET (VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE] ])  显示定义变量

     MESSAGE ( [ SEND_ERROR | STATUS | FATAL_ERROR ] "message to display " ... ) 向终端输出用户定义的信息

     ADD_EXECUTABLE ( OUTPUT input_src) 生成output 可执行文件,相关源文件是 input_src中定义的源文件列表

     ADD_LIBRARY(lib name [SHARED | STATIC | MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... )  由source文件列表生成某种类型的库文件

     SET_TARGET_PROPERTIES (target1 target2 ... PROPERTIES prop1 value1 prop2 value2 ...)  设置输出目标的属性(比如名称,版本) 

     ADD_SUBDIRECTORY( source_dir [binary_dir] [EXCLUDE_FROM_ALL] )  用于向当前工程添加存放源文件的子目录,并可指定中间二进制和目标二进制存放的位置。 exclude_from_all 参数是将这个目录从编译过程中排除。比如项目中的 example,可能是需要在工程编译完成之后,再单独编译的。 


      使用${} 引用变量

    

    -- 外部构建

            < 在源文件之外编译,生成可执行文件(库文件等)>

             

   --  目标文件的安装

            INSTALL (TARGETS targets ...  [  

                               [ ARCHIVE | LIBRARY | RUNTIME] 

                               [ DESTINATION <dir> ]

                               [ PERMISSIONS permissions ... ]

                               [ CONFIGURATIONS  [Debug | Release | ... ]

                               ]

                               [ COMPONENT <component>]

                               [ OPTIONAL ]

                               [ ....] )


       二进制文件安装  TARGETS(二进制可执行文件,动态/静态库文件)

       普通文件安装   FILES(头文件等)

       非目标文件的可执行程序安装(脚本)PROGRAMS

       目录安装    DIRECTORY


        -- 安装共享库和头文件

         使用install 安装


       -- 使用外部共享库和头文件

        INCLUDE_DIRECTORIES ( [AFTER | BEFORE] [SYSTEM] dir1 dir2 ...)  向工程中添加多个特定的头文件搜索路径。路径之间用空格分割,如果路径中包含了空格,可使用双引号将它阔气了。

        CMAKE_INCLUDE_DIRECTORIES_BEFOR/AFTER (setting on), 控制添加的头文件搜索路径放在已有路径前还是后

      

        LINK_DIRECTORIES ( dir1 dir2 .... )  添加非标准的共享库搜索路径


       TARGET_LINK_LIBRARIES (targe lib1 <debug | optimized> lib2 ... )   为target 添加需要链接的共享库。 



       -- cmake环境变量 

       CMAKE_INCLUDE_PATH 

       CMAKE_LIBRARY_PATH 

       这两个变量是系统环境变量,在export中设置 

       FIND_PATH ( what_index NAMES xx.c PATHS path) 在指定路径 path中搜索文件名xx.c 如果没有显示path,就使用 CMAKE_INCLUDE_PATH 的值

       同理, CMAKE_LIBRARY_PATH 是 FIND_LIBRARY 命令的默认搜索路径

       


       --- 常用变量 

       CMAKE_BINARY_DIR    PROJECT_BINARY_DIR    <project_name>_BINARY_DIR  这三个变量在外部构建时,均指工程编译发生的目录。


       CMAKE_SOURCE_DIR   PROJECT_SOURCE_DIR  <project_name>_SOURCE_DIR  一个意思,指向工程顶层目录

    

       CMAKE_CURRENT_SOURCE_DIR  指当前cmakelists.txt 所在路径

     

        CMAKE_CURRENT_BINARY_DIR 在外部构建中指的是 target 编译目录


        CMAKE_CURRENT_LIST_FILE 


        CMAKE_MODULE_PATH  自定义cmake模块所在的路径

   

         EXCUTABLE_OUTPUT_PATH  /  LIBRARY_OUTPUT_PATH  用来重新定义最终结果的存放目录


        PROJECT_NAME

                  

         --- cmake 调用环境变量 

         $ENV{NAME} 调用系统环境变量

         CMAKE_INCLUDE_CURRENT_DIR  自动添加 cmake_current_binary_dir   &  cmake_current_source_dir  到当前cmakelists.txt

   

         -- cmake 常用指令

        CMAKE_MINIMUM_REQUIRED ( VERSION versionNumber [FATAL_ERROR] ) 

        FILE(WIRTE | APPEND | READ | GLOB |  REMOVE | ... filename "message"  variable [ ] ... 

        INCLUDE (file1 [] module [] ..) 载入cmakelistx.txt文件

       FIND_ PACKAGE( <name> [major.minor] [QUIT] [NO_MODULE] [ [REQURIED | COMPONENTS] [ components ... ] ] )   直接调用预定义模块

     

       --- 控制指令

        IF(WIN32)

           # DO SOMETHING

      ELSEIF( UNIX)

            # DO SOMETHING

      ELSEIF(APPLE)

            # DO SOMETHING

      ENDIF(WIN32)


     FOREACH

    

    --- 模块的使用 & 自定义模块 (扩展性)

         

        - FINDCURL 举例

          对于系统预定义的 Find<name>.cmake 模块,存在CMakeModules 文件夹里。 一般使用: 

           FIND_PACKAGE(CURL)

           IF(CURL_FOUND)

           INCLUDE_DIRECTORIES( ${CURL_INCLUDE_DIR})

                        TARGET_LINK_LIBRARIES(curltest ${CURL_LIBRARY})

          ELSE( CURL_FOUND)

                          MESSAGE(FATAL_ERROR "curl lib not found")

          ENDIF(CURL_FOUND) 


          每个模块文件(.cmake) 定义以下变量:

          <name>_FOUND  

          <name>_INCLUDE_DIR  or   <name>_INCLUDES

          <name>_LIBRARY   or  <name>_LIBRARIES

          通过 <name>_FOUND  判断模块是否被找到。若找到,则 将  <name>_INCLUDE_DIR 加入 INCLUDE_DIRECTORIES,   将<name>_LIBRARY加入 TARGET_LINK_DIRECTORIES 中。 

          

          

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值