A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梦缠绕的时候 黑马粉丝团   /  2018-7-17 09:40  /  816 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

cmake中一些预定义变量
  • PROJECT_SOURCE_DIR 工程的根目录
  • PROJECT_BINARY_DIR 运行cmake命令的目录,通常是${PROJECT_SOURCE_DIR}/build
  • CMAKE_INCLUDE_PATH 环境变量,非cmake变量
  • CMAKE_LIBRARY_PATH 环境变量
  • CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径
  • CMAKE_MODULE_PATH 定义自己的cmake模块所在的路径
  • EXECUTABLE_OUTPUT_PATH 重新定义目标二进制可执行文件的存放位置
  • LIBRARY_OUTPUT_PATH 重新定义目标链接库文件的存放位置

  • 开关选项
  • BUILD_SHARED_LIBS 控制默认的库编译方式。如果未进行设置,使用ADD_LIBRARY时又没有指定库类型,默认编译生成的库都是静态库 (可在t3中稍加修改进行验证)
  • CMAKE_C_FLAGS 设置C编译选项
  • CMAKE_CXX_FLAGS 设置C++编译选项

cmake常用命令基本语法规则:
  • cmake变量使用${}方式取值,但是在IF控制语句中是直接使用变量名
  • 环境变量使用$ENV{}方式取值,使用SET(ENV{VAR} VALUE)赋值
  • 指令(参数1 参数2…)
    参数使用括弧括起,参数之间使用空格或分号分开。



    • ADD_EXECUTABLE指令为例:



    • ADD_EXECUTABLE(hello main.c func.c)或者



    • ADD_EXECUTABLE(hello main.c;func.c)


  • 指令是大小写无关的,参数和变量是大小写相关的。推荐你全部使用大写指令。


  • PROJECT
    PROJECT(projectname [CXX] [C] [Java])
    指定工程名称,并可指定工程支持的语言。支持语言列表可忽略,默认支持所有语言
  • SET
    SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
    定义变量(可以定义多个VALUE,如SET(SRC_LIST main.c util.c reactor.c))
  • MESSAGE
    MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] “message to display” 变量名)
    向终端输出用户定义的信息或变量的值
    SEND_ERROR, 产生错误,生成过程被跳过
        STATUS, 输出前缀为—的信息
    FATAL_ERROR, 立即终止所有cmake过程
  • ADD_EXECUTABLE
    ADD_EXECUTABLE(bin_file_name ${SRC_LIST})
    生成可执行文件
  • ADD_LIBRARY
    ADD_LIBRARY(libname [SHARED | STATIC | MODULE] [EXCLUDE_FROM_ALL] SRC_LIST)
    生成动态库或静态库
    SHARED 动态库
    STATIC 静态库
    MODULE 在使用dyld的系统有效,若不支持dyld,等同于SHARED
    EXCLUDE_FROM_ALL 表示该库不会被默认构建
  • ADD_SUBDIRECTORY
    ADD_SUBDIRECTORY(src_dir [binary_dir] [EXCLUDE_FROM_ALL])
    向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制的存放位置
    EXCLUDE_FROM_ALL含义:将这个目录从编译过程中排除
  • INCLUDE_DIRECTORIES
    INCLUDE_DIRECTORIES([AFTER | BEFORE] [SYSTEM] dir1 dir2 … )
    向工程添加多个特定的头文件搜索路径,路径之间用空格分隔,如果路径包含空格,可以使用双引号将它括起来,默认的行为为追加到当前头文件搜索路径的后面
  • LINK_DIRECTORIES
    LINK_DIRECTORIES(dir1 dir2 …)
    添加非标准的共享库搜索路径
  • TARGET_LINK_LIBRARIES
    TARGET_LINK_LIBRARIES(target lib1 lib2 …)
    为target添加需要链接的共享库
  • ADD_DEFINITIONS
    向C/C++编译器添加-D定义
    ADD_DEFINITIONS(-DENABLE_DEBUG -DABC),参数之间用空格分隔
  • AUX_SOURCE_DIRECTORY
    AUX_SOURCE_DIRECTORY(dir VAR)
    发现一个目录下所有的源代码文件并将列表存储在一个变量中

  • SET_TARGET_PROPERTIES
    设置输出的名称,设置动态库的版本和API版本
  • INCLUDE
    INCLUDE(file [OPTIONAL]) 用来载入CMakeLists.txt文件
    INCLUDE(module [OPTIONAL])用来载入预定义的cmake模块

IF
语法:



  • IF (expression)



  • COMMAND1(ARGS ...)



  • COMMAND2(ARGS ...)



  • ...



  • ELSE (expression)



  • COMMAND1(ARGS ...)



  • COMMAND2(ARGS ...)



  • ...



  • ENDIF (expression) # 一定要有ENDIF与IF对应


IF (expression), expression不为空时,为真: 0,NO,OFF,FALSE,NOTFOUND或<var>_NOTFOUND
IF (not exp), 与上面相反
IF (var1 AND var2)
IF (var1 OR var2)
IF (COMMAND cmd) 如果cmd确实是命令并可调用,为真
IF (EXISTS dir) IF (EXISTS file) 如果目录或文件存在,为真
IF (file1 IS_NEWER_THAN file2),当file1比file2新,或file1/file2中有一个不存在时为真,文件名需使用全路径
IF (IS_DIRECTORY dir) 当dir是目录时,为真
IF (DEFINED var) 如果变量被定义,为真
IF (var MATCHES regex) 此处var可以用var名,也可以用${var}
IF (string MATCHES regex)



  • 当给定的变量或者字符串能够匹配正则表达式regex时为真。比如:



  • IF ("hello" MATCHES "ell")



  • MESSAGE("true")

  • ENDIF ("hello" MATCHES "ell")


  • IF (WIN32)



  • #do something related to WIN32



  • ELSEIF (UNIX)



  • #do something related to UNIX



  • ELSEIF(APPLE)



  • #do something related to APPLE



  • ENDIF (WIN32)




cmake中如何增加编译选项

使用变量CMAKE_C_FLAGS添加C编译选项
使用变量CMAKE_CXX_FLAGS添加C++编译选项
使用ADD_DEFINITION添加




  • CMAKE_MINIMUM_REQUIRED(VERSION 2.8)



  • PROJECT(T1)



  • SET(SRC_LIST main.cpp)



  • SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)



  • SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)







  • MESSAGE(STATUS "This is the binary dir: "  ${PROJECT_BINARY_DIR})



  • MESSAGE(STATUS "This is the source dir: "  ${PROJECT_SOURCE_DIR})











  • ADD_SUBDIRECTORY(src)















  • LINK_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib/ ) # 这行一定要在ADD_EXECUTABLE前面











  • ADD_LIBRARY(hello_shared SHARED ${SRC_LIST}) # lib的名字不能重复



  • ADD_LIBRARY(hello_static STATIC ${SRC_LIST})



  • SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")



  • SET_TARGET_PROPERTIES(hello_shared PROPERTIES OUTPUT_NAME "hello")







  • # 设置动态库的版本号



  • SET_TARGET_PROPERTIES(hello_shared PROPERTIES VERSION 1.2 SOVERSION 1)











  • # 此处的t1跟PROJECT定义的T1没什么关系



  • ADD_EXECUTABLE(t1 ${SRC_LIST})















  • FIND_PACKAGE(CURL)



  • IF (CURL_FOUND)



  •     MESSAGE(STATUS "CURL_INCLUDE_DIR: " ${CURL_INCLUDE_DIR} " CURL_LIBRARY: " ${CURL_LIBRARY})



  •     INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR})



  •     TARGET_LINK_LIBRARIES(curltest ${CURL_LIBRARY})



  • ELSE(CURL_FOUND)



  •     MESSAGE(FATAL_ERROR "CURL library not found")



  • ENDIF(CURL_FOUND)







  • #对于系统预定义的Find<name>.cmake模块,使用方法一般如上所示:



  • #每一个模块都会定义以下几个变量



  • #• <name>_FOUND   通过此变量判断模块是否被找到



  • #• <name>_INCLUDE_DIR or <name>_INCLUDES



  • #• <name>_LIBRARY or <name>_LIBRARIES


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马