CMakeLists.txt编写常用命令

2023-05-16

文章目录

  • 一、设置cmake最小版本
  • 二、设置项目名称
  • 三、设置编译目标类型
  • 四、指定编译包含的源文件
    • 1.明确指明包含的源文件
    • 2.搜索指定目录的所有的cpp文件
    • 3.自定义搜索规则
    • 4.包含多个文件夹里的文件
  • 五、设置包含目录
  • 六、设置链接库搜索目录
  • 七、设置需要链接的库
    • 1.链接库目录搜索
    • 2.指定完整路径
    • 3.指定多个链接库
  • 八、设置变量
    • 1.set直接设置变量的值
    • 2.set追加变量的值
    • 3.list追加或删除变量的值
  • 九、条件控制
  • 十、打印消息
  • 十一、包含其他cmake文件
  • 十二、多目录
  • 十三、常用变量
    • 1.构建类型
    • 2.指定编译类型
    • 3.变量
    • 4.内置变量
    • 5.环境变量
  • 十四、系统信息
  • 十五、开关选项
  • 十六、参考链接

一、设置cmake最小版本

cmake_minimum_required (VERSION 2.8)

二、设置项目名称

project(demo)

三、设置编译目标类型

  • 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文件。

四、指定编译包含的源文件

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})

五、设置包含目录

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}")

六、设置链接库搜索目录

link_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/libs64
)

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

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

七、设置需要链接的库

1.链接库目录搜索

target_link_libraries(demo test)

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

  • Windows下会搜索test.lib文件;
  • Linux下会搜索libtest.a和libtest.so。

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

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

2.指定完整路径

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

3.指定多个链接库

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

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

八、设置变量

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})

九、条件控制

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()

十、打印消息

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

十一、包含其他cmake文件

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

十二、多目录

可以使用 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})

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

十三、常用变量

1.构建类型

CMAKE_BUILD_TYPE对应的c编译选项变量对应的c++编译选项变量
NoneCMAKE_C_FLAGSCMAKE_CXX_FLAGS
DebugCMAKE_C_FLAGS_DEBUGCMAKE_CXX_FLAGS_DEBUG
ReleaseCMAKE_C_FLAGS_RELEASECMAKE_CXX_FLAGS_RELEASE
RelWithDebInfoCMAKE_C_FLAGS_RELWITHDEBINFOCMAKE_CXX_FLAGS_RELWITHDEBINFO
MinSizeRelCMAKE_C_FLAGS_MINSIZERELCMAKE_CXX_FLAGS_MINSIZEREL

2.指定编译类型

  • windows
  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) #这里没有“$”符号

十四、系统信息

  • 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

十五、开关选项

  • 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 ..

十六、参考链接

  1. https://www.cnblogs.com/xl2432/p/11225276.html
  2. https://www.cnblogs.com/hbccdf/p/introduction_of_cmake.html
  3. https://blog.csdn.net/qq_38410730/article/details/102477162
  4. https://bianchengnan.gitee.io/articles/cmake-generate-specific-version-vs-project-file/
  5. https://zhuanlan.zhihu.com/p/370200194
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 前端图片裁剪cropper.js

    背景 xff1a 我们在项目中常常都会有更换登陆人头像的需求 xff0c 这个很简单直接上传一张图片展示就可以了 xff0c 但是如果上传的图片需要剪裁成正方形的话就需要我们来做一些特殊的处理 xff1b 这里我们会用到一个图片剪裁插件 x
  • 新产品开发之C流程 (C-flow)

    关于新产品开发的C流程 C flow xff0c 是世界上大公司采用的标准开发流程 xff0c 十分基本也十分重要 xff0c 但是网上关于C流程介绍相关的资料很少 xff0c 所以花点时间整理一下相关的资料 下面以软件BSP开发为例 xf
  • Arduino的Stepper库函数及其控制步进电机(ULN2003)调速

    问题来源 最近自学Arduino xff0c 在使用步进电机时开始没能使步进电机转起来 xff0c 转起来后感觉没法调速 xff0c 遂完成此篇笔记供自己后续查阅以及方便遇到相同问题的诸君寻找灵感 对于如何使步进电机转动就不详述 xff0c
  • 一、电脑端实现单片机与ESP8266的通信

    1 准备工具 xff08 硬件 软件 xff09 硬件 xff1a 51单片机开发板 ESP8266无线模块 xff08 ESP8266 01 xff09 TTL USB串口 杜邦线 数据线 xff1b 软件 xff1a keil uv4单
  • 错误 LNK2038 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“2”不匹配值“0”(main.obj 中)

    前言 vs2019报错如下图 xff1a 错误 LNK2038 检测到 ITERATOR DEBUG LEVEL 的不匹配项 值 2 不匹配值 0 main obj 中 错误原因 1 产生这个问题的原因是当前工程是Debug版本 xff0c
  • 三种获取字节码对象的方式及区别

    方式一 xff1a 对象 getClass 方法是 根对象Object的方法 是其他类继承Object的getClass方法 方式二 xff1a 类名 class xff0c 你可以理解为字节码本身就是静态的 xff0c 类加载的时字节码就
  • 关于接口与Object 类的关系

    看到这个标题 xff0c 你或许就会想好自己的那份答案 但事实上这个确实没有答案 xff0c 至少没官方证明它们之间的基友关系 看法一 xff1a 因为老师说 xff0c 你可以把接口看作是特殊的类 xff0c 所以不假思索的就认为接口也
  • 单词博弈Java实现(借鉴“miss若尘”博客中写的解题思路)

    单词博弈Java实现 xff0c 已经通过庞果网的用例测试 代码如下 import java util HashMap public class WordGameFinalTest public static int who String
  • 我的2013,梦在路上

    我的2013 xff0c 在路上 今年最后一次给姐姐打电话 xff0c 她在那里像我炫耀自己和爸爸妈妈一起跨年 xff0c 说1314的意义 xff0c 而我还在北京苦逼着 回想2013年对于我来说 xff0c 或许是不错的一年 这一年我进
  • mysql安装时的粗心错误:last error unable to update security settings. access denied for user 'root' @ 'localh

    来自 梦想家haima 39 s blog gt http blog dreamwe cn 这个报错出现在mysql最后 当你看到mysql的最后一步需要设置密码可能你开心得很 Mysql就快安装好了 赶快输入三行密码都是root 结果报下
  • @SuppressWarnings

    简介 xff1a java lang SuppressWarnings是J2SE 5 0中标准的Annotation之一 可以标注在类 字段 方法 参数 构造方法 xff0c 以及局部变量上 作用 xff1a 告诉编译器忽略指定的警告 xf
  • 欢迎使用CSDN-markdown编辑器

    欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来 xff0c 用它写博客 xff0c 将会带来全新的体验哦 xff1a Markdown和扩展Markdown简洁的语法代码块高亮图片链接和图片上传
  • Linux之强大的awk

    来自 梦想家 Haima s blog gt http blog dreamwe cn awk简介 awk是Linux中的一个命令 xff0c 用来做文本处理与分析 xff0c 功能简单强悍 xff0c 同时它也是一门编程语言 awk处理文
  • ucos源码分析(一)

    时间 2018 01 27 本人目前是大三学生 电子信息工程专业 xff0c 在大学前俩年的时间 xff0c 一直在使用和学习单片机 xff0c 不过也仅仅是从 xff15 xff11 到 xff13 xff12 xff0c 马上要面临就业
  • 随笔——Python & C++ 混用——使用cmake生成c++动态库

    Python amp C 43 43 混用 xff0c 使用cmake 生成c 43 43 动态库 xff0c 可供python调用 说明 xff1a test cpp为源文件 add h为头文件 源文件使用第三方库opencv CMake
  • 机会都是留给有准备的人,你在准备什么?| 每天成就更大成功

    最近养成一个习惯 xff0c 就是每晚抄书 xff0c 大概200字左右 xff0c 在抄书的过程中反思了一个问题 xff1a 因为字写的不漂亮 xff0c 于是就在抄书的时候就有意的去练字 xff0c 这样抄书的精力就被分散了一部分出去
  • 《SQL Server 2005开发技术大全》分享一本书

    数据库是一个非常重要的领域 xff0c 不管是什么样的系统 xff0c 都必须要与数据库打交道 xff0c 因此作为一个程序员来讲 xff0c 数据库的基本知识技能是必须要掌握的 我接触C 已经有两年半的时间了吧 xff0c 在学习之初是接
  • golang语言rsa加解密及签名验签

    golang语言rsa加解密及签名验签 96 rsa 96 算法概述 96 Rsa 96 结构体封装封装的优点使用案例 rsa算法 概述 rsa是一种非对称的可逆的加密算法 xff0c 对加密数据长度有限制 xff0c 同时rsa也提供了数
  • 异常与错误处理

    异常与错误处理 PHP的异常与错误是分开的 xff0c 当程序出现异常时会throw一个 Exception 或子类 对象 xff0c 但是当出现错误时会触发一个错误 1 异常处理 1 1 通过try catch主动处理异常 span cl
  • 设计模式

    1 什么是模式 设计模式是对某些典型易变问题的特定解决方案 xff0c 这些问题和解决方案经过分类总结 xff0c 并且为了方便交流给每个解决方案都起了特定的名字 模式是为了解决变化的问题 xff0c 将变化的问题进行封装 xff0c 让变

随机推荐

  • pdo-mysql

    pdo mysql PHP连接数据库推荐使用PDO xff0c PDO扩展为PHP访问数据库定义了一个轻量级接口 我们可以通过实现PDO接口的每个数据库驱动来访问数据库服务 访问mysql数据库服务 xff0c 我们使用PDO MYSQL驱
  • db封装

    db封装 以下Connection类封装支持以下几个特性 1 参数绑定防止sql注入2 读写分离3 多主多从 xff0c 多节点负载均衡4 故障自动摘除及自动恢复 代码实现 span class token delimiter import
  • 数据结构

    1 数据结构 提到算法不能不提数据结构 xff0c 数据结构就是数据元素按照一种或多种关系的集合 xff0c 按照逻辑结构划分 xff0c 可以分为 xff1a 1 1 集合 集合是由一堆无序的 相关联的 xff0c 且不重复的数据元素组成
  • 数据切分——Atlas介绍

    Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目 它在MySQL官方推出的MySQL Proxy 0 8 2版本的基础上 xff0c 修改了大量bug xff0c 添加了很多功能
  • Nginx负载均衡:分布式/热备Web Server的搭建

    Nginx是一款轻量级的Web 服务器 反向代理服务器 及电子邮件 xff08 IMAP POP3 xff09 代理服务器 xff0c 并在一个BSD like 协议下发行 由俄罗斯的程序设计师Igor Sysoev所开发 xff0c 供俄
  • 数据切分——Atlas读写分离Mysql集群的搭建

    关于数据切分的原理可以参见博客 xff1a http blog csdn net jhq0113 article details 44226789 关于Atlas的介绍可以参见博客 xff1a http blog csdn net jhq0
  • k8s 官方文档

    k8s 官方文档 https kubernetes io zh docs home
  • 数据切分——Mysql分区表的建立及性能分析

    Mysql的安装方法可以参考 xff1a http blog csdn net jhq0113 article details 43812895 Mysql分区表的介绍可以参考 xff1a http blog csdn net jhq011
  • 利用C++求解一元二次方程

    题目 xff1a 求解一元二次方程 xff1a ax 43 bx 43 c 61 0 的解 xff0c 其中a 61 1 b 61 3 c 61 2 分析 xff1a 大家都知道一元二次方程的解有三种情况 xff0c 即考虑 61 xff0
  • VS2019配置BOOST-v1.70.0库

    文章目录 vs2019配置c 43 43 boost库安装编译Boost c 43 43 library新建vs2019 c 43 43 项目 xff0c 并添加boost依赖库代码测试 c 43 43 boost库说明主要分类常用库相关图
  • sudo aptitude install sudo apt-get update sudo apt-get install libatlas-dev

    记坑 xff1a sudo apt get update 报错 xff1a 没有公钥 xff0c 解决办法 xff1a sudo apt key adv keyserver keyserver ubuntu com recv keys 13
  • 深度学习综述之分类(适合深度学习面试者看)

    目前图像方向 xff0c 主要用深度学习进行分类 xff0c 定位 xff08 回归 xff09 xff0c 检测 xff0c 那么她三主要区别是什么呢 xff1f 分类 xff1a 是什么 xff1f 定位 xff1a 在哪里 xff1f
  • tf变换及工具说明(1)

    tf变换及工具说明 xff08 1 xff09 xff09 tf说明解释tf 库常用方法tf数据类型静态tf发布tf动态发布tf接收坐标转换平面坐标系例子 坐标转换传递 tf说明解释 在ros下有一个库 xff1a tf xff0c 其主要
  • Python实现微信自动回复(机器人版本)

    现在微信使用程度越来越高 xff0c 就想到能不能微信实现像qq似得自动回复功能 在实现的过程中发现 xff0c 图灵机器人也有微信的接口 xff0c 就拿来用了 机器人创建完成后 xff0c 会生成一个APIkey xff0c 用来和程序
  • PPTV面试题——括号消除

    题目 xff1a 给定一个字符串 xff0c 设计一个算法消除其中承兑的括号 xff0c 如果括号不成对 xff0c 提示异常 xff08 error xff09 如 xff08 1 xff0c xff08 2 3 xff09 xff0c
  • reStructuredText(rst)简介+安装+简单说明

    reStructuredText简介 43 安装 43 简单说明 reStructuredText是什么 reStructuredText是扩展名为 rst的纯文本文件 xff0c 含义为 重新构建的文本 xff0c 是python编程语言
  • 【VS Code】"The 'clang-format' command is not available. Please check your clang-format."报错

    文章目录 34 The 39 clang format 39 command is not available 34 报错说明一 安装插件 clang format 二 解决方案三 参考链接 34 The clang format comm
  • 大环境不好,找工作太难?看我历时10天三面阿里,成功入职...

    三面大概九十分钟 xff0c 问的东西很全面 xff0c 需要做充足准备 xff0c 就是除了概念以外问的有点懵逼了 xff08 呜呜呜 xff09 回来之后把这些题目做了一个分类并整理出答案 xff08 强迫症的我狂补知识 xff09 分
  • Ubuntu18.04 远程命令行下安装并启动x11vnc

    最近做项目需要连接ubuntu的图像界面 xff0c 开始用XQuartZ xff0c 界面太low太丑 xff0c 而且有些应用启动不了 xff1b 后来转到使用x11vnc xff0c 在网络上查看了很多交安装x11vnc的方法 xff
  • CMakeLists.txt编写常用命令

    文章目录 一 设置cmake最小版本二 设置项目名称三 设置编译目标类型四 指定编译包含的源文件1 明确指明包含的源文件2 搜索指定目录的所有的cpp文件3 自定义搜索规则4 包含多个文件夹里的文件 五 设置包含目录六 设置链接库搜索目录七