目录

注:本文主要引用自https://www.cnblogs.com/hbccdf/p/introduction_of_cmake.html

1. 设置cmake最小版本

cmake_minimum_required (VERSION 2.8)

2. 设置项目名称

project(demo)

3. 设置编译目标类型

  • add_executable:生成可执行文件
  • add_library:生成库文件

add_library默认生成静态库,可以显示指定生成库的类型:

#静态库
add_library(test STATIC test.cpp) #动态库
add_library(test SHARED test.cpp)

windows下生成的可执行文件是*.exe, 静态库是*.lib,动态库是*.lib*.dll都有,但是*.lib文件很小,只是指向*.dll文件,相当于Linux下的软连接。

Linux下的可执行程序没有后缀名,静态库是lib*.a文件,动态库是lib*.so文件。

4. 指定编译包含的源文件

1. 明确指明包含的源文件

add_executable(demo main.cpp test.cpp util.cpp)

2. 搜索指定目录的所有的cpp文件

aux_source_directory(. SRC_LIST) #搜索当前目录下的所有.cpp文件
add_executable(demo ${SRC_LIST})

3. 自定义搜索规则

file(GLOB SRC_LIST "*.cpp" "*.cc")
add_executable(demo ${SRC_LIST})

GLOB不支持递归遍历子目录,若想实现递归遍历子目录,请使用GLOB_RECURSE

4. 包含多个文件夹里的文件

file(GLOB SRC_LIST "*.cpp" "protocol/*.cpp")
add_executable(demo ${SRC_LIST})
# 或者
file(GLOB SRC_LIST "*.cpp")
file(GLOB SRC_PROTOCOL_LIST "protocol/*.cpp")
add_executable(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})
# 或者
aux_source_directory(. SRC_LIST)
aux_source_directory(protocol SRC_PROTOCOL_LIST)
add_executable(demo ${SRC_LIST} ${SRC_PROTOCOL_LIST})

5. 设置包含目录

include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/include
)

Linux下还可以通过flag的方式设置:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_CURRENT_SOURCE_DIR}")

6. 设置链接库搜索目录

link_directories(
${CMAKE_CURRENT_SOURCE_DIR}/libs64
)

Linux下还可以通过flag的方式设置:

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_CURRENT_SOURCE_DIR}/libs64")

7. 设置需要链接的库

链接库目录搜索

target_link_libraries(demo test)

该指令会在链接库目录(包括系统默认库目录和指定的自定义库目录)下搜索文件:

  • Windows下会搜索test.lib文件;
  • Linux下会搜索libtest.alibtest.so

当动态库和静态库同时存在时,默认会优先链接动态库,可以在链接时指定动态库或静态库:

target_link_libraries(demo test.a)  # 链接静态库
target_link_libraries(demo test.so) # 链接动态库

指定完整路径

target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/lib/libtest.a)
target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/lib/test.so)

指定多个链接库

target_link_libraries可以一次添加多个链接库:

target_link_libraries(demo
${CMAKE_CURRENT_SOURCE_DIR}/libs64/libtest.a
pthread)

8. 设置变量

1. set直接设置变量的值

set(SRC_LIST main.cpp test.cpp)
add_executable(demo ${SRC_LIST})

2. set追加变量的值

set(SRC_LIST main.cpp)
set(SRC_LIST ${SRC_LIST} test.cpp)
add_executable(demo ${SRC_LIST})

3. list追加或删除变量的值

set(SRC_LIST main.cpp)
list(APPEND SRC_LIST test.cpp)
list(REMOVE_ITEM SRC_LIST main.cpp)
add_executable(demo ${SRC_LIST})

9. 条件控制

if...else...elseif...endif

if(MSVC)
set(LINK_LIBS common)
else()
set(boost_thread boost_log.a boost_system.a)
endif() target_link_libraries(demo ${LINK_LIBS}) if(${CMAKE_BUILD_TYPE} MATCHES "debug")
...
else()
...
endif()

while break continue foreach endwhile endforeach

while(TRUE)
message(STATUS "While true")
break()
endwhile() foreach(project_file ${COMMON_PROJECT_FILES})
message(STATUS "project file found -- ${project_file}")
include("${project_file}")
endforeach()

10. 打印消息

message(${MY_VAR})
message("build with debug mode")
message(WARNING "this is warnning message")
message(FATAL_ERROR "this build has many error") # 会导致生成失败

11. 包含其他cmake文件

include(./common.cmake) #指定包含文件的全路径
include(def) #在搜索路径中搜索def.cmake文件
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) #设置include的搜索路径

12. 多目录

可以使用add_subdirectory的方式添加子目录,注意子目录下也需要一个CMakeLists.txt文件。

https://www.cnblogs.com/hbccdf/p/introduction_of_cmake.html 中的例子说明,项目目录是

./demo
|
+--- main.cc
|
+--- math/
|
+--- MathFunctions.cc
|
+--- MathFunctions.h

在添加cmake文件后结构如下:

./demo
|
+--- CMakeLists.txt
|
+--- main.cc
|
+--- math/
|
+--- CMakeLists.txt
|
+--- MathFunctions.cc
|
+--- MathFunctions.h

demo下的CMakeLists.txt文件如下:

cmake_minimum_required (VERSION 2.8)
project(demo)
aux_source_directory(. DIR_SRCS) # 添加math子目录
add_subdirectory(math) # 指定生成目标
add_executable(demo ${DIR_SRCS}) # 添加链接库
target_link_libraries(demo MathFunctions)

math目录下的CMakeLists.txt文件如下:

aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库
add_library(MathFunctions ${DIR_LIB_SRCS})

在采用这种方式时,注意在写代码时就要规划好模块。

13. 常用变量

1. 构建类型

CMAKE_BUILD_TYPE 对应的c编译选项变量 对应的c++编译选项变量
None CMAKE_C_FLAGS CMAKE_CXX_FLAGS
Debug CMAKE_C_FLAGS_DEBUG CMAKE_CXX_FLAGS_DEBUG
Release CMAKE_C_FLAGS_RELEASE CMAKE_CXX_FLAGS_RELEASE
RelWithDebInfo CMAKE_C_FLAGS_RELWITHDEBINFO CMAKE_CXX_FLAGS_RELWITHDEBINFO
MinSizeRel CMAKE_C_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_MINSIZEREL

2. 指定编译类型

widnows

  1. windows中可以在VS中进行选择配置, 默认都会生成四中配置。
  2. 要改变默认配置,需在cmake文件中配置:
set(CMAKE_CONFIGURATION_TYPES "Debug;RelWithDebInfo")
  1. 默认生成的平台类型为Win32,如果需要x64类型,则需要按如下命令执行:
cmake -G "Visual Studio 14 2015 Win64" ..

linux

  1. Linux下默认会生成none类型的配置;
  2. 可通过命令行指定配置:
cmake -DCMAKE_BUILD_TYPE=Debug ..
  1. 也可以在CMake文件中指定配置:
set(CMAKE_BUILD_TYPE DEBUG)

3. 变量

  • 自定义变量使用set来定义,如:
set(OBJ_NAME, xxxxx)
  • 使用时使用${},和shell类似,如${OBJ_NAME}
  • 在if命令里,直接使用变量名即可,不需要加${}

4. 内置变量

  • CMAKE_BINARY_DIR,PROJECT_BINARY_DIR,_BINARY_DIR:这三个变量内容一致,如果是内部编译,就指的是工程的顶级目录,如果是外部编译,指的就是工程编译发生的目录。

  • CMAKE_SOURCE_DIR,PROJECT_SOURCE_DIR,_SOURCE_DIR: 这三个变量内容一致,都指的是工程的顶级目录。

  • CMAKE_CURRENT_BINARY_DIR: 外部编译时,指的是target目录,内部编译时,指的是顶级目录

  • CMAKE_CURRENT_SOURCE_DIR: CMakeList.txt所在的目录

  • CMAKE_CURRENT_LIST_DIR: CMakeList.txt的完整路径

  • CMAKE_CURRENT_LIST_LINE: 当前所在的行

  • CMAKE_MODULE_PATH: 如果工程复杂,可能需要编写一些cmake模块-,这里通过SET指定这个变量

  • LIBRARY_OUTPUT_DIR,BINARY_OUTPUT_DIR: 库和可执行的最终存放目录

5. 环境变量

  • 使用环境变量:$ENV{Name}
  • 写入环境变量:set(ENV{Name} value) #这里没有“$”符号

14. 系统信息

  • CMAKE_MAJOR_VERSION,CMAKE 主版本号,比如2.4.6 中的2
  • CMAKE_MINOR_VERSION,CMAKE 次版本号,比如2.4.6 中的4
  • CMAKE_PATCH_VERSION,CMAKE 补丁等级,比如2.4.6 中的6
  • CMAKE_SYSTEM ,系统名称,比如Linux-2.6.22
  • CMAKE_SYSTEM_NAME ,不包含版本的系统名,比如Linux
  • CMAKE_SYSTEM_VERSION ,系统版本,比如2.6.22
  • CMAKE_SYSTEM_PROCESSOR,处理器名称,比如i686
  • UNIX ,在所有的类UNIX平台为TRUE,包括OS X 和cygwin
  • WIN32 ,在所有的win32 平台为TRUE,包括cygwin

15. 开关选项

  • BUILD_SHARED_LIBS: 用来控制默认的库编译方式,如果 不设置,使用add_library在没有指定库类型的情况下,默认生成的都是静态库。如果设置了set(BUILD_SHARED_LIBS ON)后,默认生成动态库。
  • CMAKE_C_FLAGS设置C编译选项,也可以通过add_definitions()添加
  • CMAKE_CXX_FLAGS设置C++编译选项,也可以通过指令add_definitions()添加。
  • option可以添加cmake编译选项。

    如我们想在代码中添加一个宏:
...

#ifdef USE_MACRO

...

#endif

我们可以通过在项目中的CMakeLists.txt 中添加如下代码控制代码的开启和关闭.

option(USE_MACRO
"Build the project using macro"
OFF) IF(USE_MACRO) add_definitions("-DUSE_MACRO") endif(USE_MACRO)

add_definitions的作用是添加一个代码中可以使用的宏,而option的作用是添加一个cmake可以使用的参数,在构建项目时,你就可以使用如下指令进行控制:

cmake  -DUSE_MACRO=on ..
cmake  -DUSE_MACRO=off ..

CMakeLists.txt编写常用命令的更多相关文章

  1. CMake之CMakeLists.txt编写入门

    自定义变量 主要有隐式定义和显式定义两种. 隐式定义的一个例子是PROJECT指令,它会隐式的定义< projectname >_BINARY_DIR和< projectname & ...

  2. CMAKE 生成VS2008静态库工程 与 CMAKE使用,CMakeLists.txt编写总结

    cmake -G"Visual Studio 9 2008 Win64" 以上命令得用cd命令切换到顶层CMakeLists.txt的当前目录,才能生效 以下是CMakeLists ...

  3. CMakeList.txt(2):CMakeLists.txt编写规则

    #project namePROJECT(test_math)    指定生成的工程名为test_math #head file path     INCLUDE_DIRECTORIES(includ ...

  4. ubuntu下opencv CMakeLists.txt编写

    # 声明要求的 cmake 最低版本 cmake_minimum_required( VERSION 2.8 ) # 声明一个 cmake 工程 project( pro ) # 设置编译模式 set ...

  5. Linux c++ vim环境搭建系列(6)——CMakeLists.txt多文档多目录组织方法和编写示例

    CMakeLists.txt学习 1. 概要 主要是关于cmakelists.txt的编写模板,和多文档多目录的组织方法详解, 涉及第三方库的添加使用方法. 这里主要介绍cmakelists.txt的 ...

  6. linux CMakeLists.txt 语法

    CMake入门教程 参考文献:http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/index.html 官方网址:http://www.cmak ...

  7. CMakeLists.txt使用

    背景:C++代码在编译的过程中需要进行文件的包含,该文主要介绍CMakeLists.txt相关语法 CMake之CMakeLists.txt编写入门

  8. shell脚本编写步骤及其常用命令和符号

    1,什么是Shell     Shell 是kernel的一个外壳,是一个命令解析器,负责用户与内核的交互.2,Shell脚本     Shell脚本类似于批处理,可以方便的执行大量命令.3,编写sh ...

  9. Cmake知识----编写CMakeLists.txt文件编译C/C++程序

    1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...

随机推荐

  1. luoguP5094 [USACO04OPEN]MooFest 狂欢节

    get 到的 这种需要求 含 max 的式子,枚举最大值的方法非常普遍. 类似的,还有含 min , gcd 的式子,枚举他们也很普遍 主要难点 我们首先想到,先按 v 从小到大排序,因为这样既可以简 ...

  2. pytroch 权重初始化和加载词向量的方法

    1.几种不同的初始化方法 import torch.nn as nn embedding = torch.Tensor(3, 5) #如下6种初始化方法 #正态分布 nn.init.normal_(e ...

  3. django登录页面设计:

    urls: """day42 URL Configuration The `urlpatterns` list routes URLs to views. For mor ...

  4. 【Ribbon篇四】Ribbon初步配置(2)

    一. 微服务消费者改造 注:修改microservicecloud-consumer-dept-80工程 1. pom.xml添加依赖 <!-- eureka client --> < ...

  5. RPM 包

    RPM 包 RPM 包是由 Red Hat 公司所开发的包管理系统 RPM 经过编译,无法看到源码,但是安装速度会快很多 RPM 包管理 RPM 包命名规则 包名 - 版本号 - 发布版本号 . 软件 ...

  6. LeetCode 739 每日温度

    1.直接遍历 暴力求解 class Solution { public: vector<int>dailyTemperatures(vector<int>& T) { ...

  7. AtCoder Grand Contest 036

    Preface 这篇已经鸽了好久的说,AGC037都打完了才回来补所以题目可能都记不大清楚了,如有错误请指正 这场感觉难度远高于上一场,从D开始就不会了,E没写(看了题解都不会写),F就是抄曲明姐姐的 ...

  8. Paper | BLIND QUALITY ASSESSMENT OF COMPRESSED IMAGES VIA PSEUDO STRUCTURAL SIMILARITY

    目录 1. 技术细节 1.1 得到MDI 1.2 判别伪结构,计算伪结构相似性 2. 实验 动机:作者认为,基于块的压缩会产生一种伪结构(pseudo structures),并且不同程度压缩产生的伪 ...

  9. 局域网部署ntp时间服务器

    搭建ntp时间服务器 时间服务器配置 须切换到root用户,再进行操作 检查ntp是否安装 [root@hadoop01 ~]# rpm -qa | grep ntp 如果没有安装,须安装 [root ...

  10. TensorFlow函数: tf.stop_gradient

    停止梯度计算. 在图形中执行时,此操作按原样输出其输入张量. 在构建计算梯度的操作时,这个操作会阻止将其输入的共享考虑在内.通常情况下,梯度生成器将操作添加到图形中,通过递归查找有助于其计算的输入来计 ...