CMAKE入门

cmake

首先打开顶层目录CMakeList.txt
1、描述cmake_minimum_required (VERSION 2.x)最低版本要求
2、设置建立工程工程名字 使用 SET 指令,就可以构建一个自定义变量了
3、设置输出路径
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)

CMAKE_RUNTIME_OUTPUT_DIRECTORY :输出可执行文件
CMAKE_LIBRARY_OUTPUT_DIRECTORY  :库文件一般.so动态库
CMAKE_ARCHIVE_OUTPUT_DIRECTORY :库文件 一般静态库
4、配置工程文件
     include(config.cmake)
5、设置目标平台名字
    set(TARGET_PLATFORM ${DEFAULT_TARGET_PLATFORM})
6、设置编译类型
    set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type")
7、设置project版本号相关信息
   如 :set(project_version "${VESION}.${AND_SO_ON}")
8、set(CMAKE_VERBOSE_MAKEFILE ON)
       显示详细的原始编译信息,主要用于定位一些链接错误,看看库路径什么的是否配置对。
9、根据目标平台设置不同交叉编译环境.cmake
10、set_property:在指定域中设置一个命名属性
       set_property(GLOBAL PROPERTY 目标名字 "")
如下:
       set_property(<GLOBAL                  |
                DIRECTORY [dir]                   |
                TARGET    [target1 [target2 ...]] |
                SOURCE    [src1 [src2 ...]]       |
                TEST      [test1 [test2 ...]]     |
                CACHE     [entry1 [entry2 ...]]>
                PROPERTY <name>[value1 [value2 ...]])

    在某个域中对零个或多个对象设置一个属性。第一个参数决定该属性设置所在的域。它必须为下面中的其中之一:
    GLOBAL域是唯一的,并且不接特殊的任何名字。
    DIRECTORY域默认为当前目录,但也可以用全路径或相对路径指定其他的目录(前提是该目录已经被CMake处理)。
    TARGET域可命名零或多个已经存在的目标。
    SOURCE域可命名零或多个源文件。注意:源文件属性只对在相同目录下的目标是可见的(CMakeLists.txt)。
    TEST域可命名零或多个已存在的测试。
    CACHE域必须命名零或多个已存在条目的cache.
    PROPERTY后面紧跟着要设置的属性的名字。

13、include 工程上用到的头文件
    如:include_directories(${PATH_INCLUDE})
14、在工程全局范围内定义相关宏
    如:add_definitions(-DMACRO)
15、根据子模块目录进行相关操作
    如:add_subdirectory(子目录名字)

相关cmake操作:
1 、set命令: 将一个CMAKE变量设置为给定值。
  set(<variable> <value> [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])
  将变量<variable>的值设置为<value>。在<variable>被设置之前,<value>会被展开。如果有CACHE选项,那么<variable>就会添加到cache中;这时<type>和<docstring>是必需的。<type>被CMake GUI用来选择一个窗口,让用户设置值。<type>可以是下述值中的一个:
  FILEPATH = 文件选择对话框。
  PATH     = 路径选择对话框。
  STRING   = 任意的字符串。
  BOOL     = 布尔值选择复选框。
  INTERNAL = (不需要GUI输入端,适用于永久保存的变量)。
 如果<type>是内部的(INTERNAL),那么<value>总是会被写入到cache中,并替换任何已经存在于cache中的值。如果它不是一个cache变量,那么这个变量总是会写入到当前的makefile中。FORCE选项将覆盖cache值,从而去掉任何用户带来的改变。
  如果指定了PARENT_SCOPE选项,变量<variable>将会被设置为当前作用域之上的作用域中。

  如果想全局共享某变量3种方法:
  1、要用set(variable value CACHE INTERNAL docstring )这种方式定义的变量会把变量加入到CMakeCache.txt然后各级目录共享会访问到这个变量。
  2、set(${variable} ${value} PARENT_SCOPE) PARENT_SCOPE  放到顶层则全局,子目录可以共享
  3、set_property(GLOBAL PROPERTY ${variable} "${value}" ) 在其他目录  get_property( GLOBAL PROPERTY ${variable} ) 
  
2、CMake可以通过execute_process调用shell命令或者脚本,如下:
    execute_process(COMMAND <cmd1> [args1...]]
                [COMMAND <cmd2> [args2...] [...]]
                [WORKING_DIRECTORY <directory>]
                [TIMEOUT <seconds>]
                [RESULT_VARIABLE <variable>]
                [OUTPUT_VARIABLE <variable>]
                [ERROR_VARIABLE <variable>]
                [INPUT_FILE <file>]
                [OUTPUT_FILE <file>]
                [ERROR_FILE <file>]
                [OUTPUT_QUIET]
                [ERROR_QUIET]
                [OUTPUT_STRIP_TRAILING_WHITESPACE]
                [ERROR_STRIP_TRAILING_WHITESPACE])
     调用shell命令:execute_process(COMMAND <shell命令> WORKING_DIRECTORY <此句shell命令执行的工作目录>)
     调用脚本:execute_process(COMMAND sh example.sh WORKING_DIRECTORY <example.sh所在目录>)
3、     
     add_custom_command :
     add_custom_command(TARGET target
                   PRE_BUILD | PRE_LINK | POST_BUILD
                   COMMAND command1 [ARGS] [args1...]
                   [COMMAND command2 [ARGS] [args2...] ...]
                   [WORKING_DIRECTORY dir]
                   [COMMENT comment] [VERBATIM])
This defines a new command that will be associated with building the specified target. When the command will happen is determined by which of the following is specified:

PRE_BUILD - run before all other dependencies
PRE_LINK - run after other dependencies
POST_BUILD - run after the target has been built
     1、增加自定义命令来产生一个输出
     2、为某个目标添加一条命令
     如:add_custom_command(TARGET ${xxx}
         POST_BUILD|PRE_LINK|PRE_BUILD
         COMMAND xxxx
        )
4、需要在cmake中创建一些目标,需要通过add_custom_target来指定。add_custom_command可以用来完成对add_custom_target生成的target的补充。

5、add_library 
   add_library(libName [STATIC | SHARED | MODULE]
            [source1] [source2] [...])
   libName库名字,该库文件会根据命令里列出[source**]源文件。而STATIC、SHARED和MODULE的作用是指定生成的库文件的类型
    
6、target_link_libraries
   该指令的作用为将目标文件与库文件进行链接。

7、link_directories 设置库链接路径

8、string(CONCAT CMAKE_C_FLAGS         ${CMAKE_C_FLAGS}     " ****")
   string(CONCAT CMAKE_CXX_FLAGS       ${CMAKE_CXX_FLAGS}   "****")
   通过上述两个命令来设置编译选项CFLAGS CPPFLAGS
9、 LDFLAGS 也可以通过下面四种选项处理
   CMAKE_EXE_LINKER_FLAGS:Linker flags to be used to create executables.
   CMAKE_MODULE_LINKER_FLAGS:Linker flags to be used to create modules.
   CMAKE_SHARED_LINKER_FLAGS:Linker flags to be used to create shared libraries.
   CMAKE_STATIC_LINKER_FLAGS:Flags to be used to create static libraries. These flags will be passed to the archiver when creating a static library.
   如:通过string(CONCAT CMAKE_EXE_LINKER_FLAGS  ${CMAKE_EXE_LINKER_FLAGS}  "****"}来设置链接选项LDFLAGS 

 

 

相关参考CMake 入门实战: https://www.hahack.com/codes/cmake/

发布了2 篇原创文章 · 获赞 2 · 访问量 307
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览