cmake 简单使用

转载地址:  https://blog.csdn.net/wzzfeitian/article/details/40963457

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…)
    参数使用括弧括起,参数之间使用空格或分号分开。

    1. ADD_EXECUTABLE指令为例:
    2. ADD_EXECUTABLE(hello main. c func.c)或者
    3. 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
语法:

  1. IF (expression)
  2. COMMAND1(ARGS ...)
  3. COMMAND2(ARGS ...)
  4. ...
  5. ELSE (expression)
  6. COMMAND1(ARGS ...)
  7. COMMAND2(ARGS ...)
  8. ...
  9. 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)

  1. 当给定的变量或者字符串能够匹配正则表达式regex时为真。比如:
  2. IF ( "hello" MATCHES "ell")
  3. MESSAGE( "true")
  4. ENDIF ( "hello" MATCHES "ell" )
  1. IF (WIN32)
  2. #do something related to WIN32
  3. ELSEIF (UNIX)
  4. #do something related to UNIX
  5. ELSEIF(APPLE)
  6. #do something related to APPLE
  7. 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值