CMakeLists.txt详解

2023-05-16

一:CMakeLists.txt文件是cmake用来生成Makefile文件需要的一个描述编译链接的规则文件

学习cmake需要提前了解gcc等编译命令,先来解释一条最简单的命令

        gcc ./source/*.c -o ./bin/test -I ./include -L ./lib/ -l动态库名

上述命令的解释为:用gcc工具编译当前目录下source文件夹中的所有的.c文件 生成目标为test的可执行文件且将其放在当前目录下的bin文件夹中,其所用到的头文件所在路径为当前目录下的include文件夹,动态库文件路径为当前目录下的lib文件夹,编译时需要用到的动态库为库名所对应的.so动态库

二:CMakeList.txt规则文件常用变量

(1)常用变量

        PROJECT_NAME:用函数project(demo)指定的项目名称,这里变量的值为demo

        PROJECT_SOURCE_DIR:工程的根目录

        PROJECT_BINARY_DIR:执行cmake命令的目录,如果mkdir build ,cd build, cmake ../,的话,该变量的值为build目录

        CMAKE_CURRENT_SOURCE_DIR:当前处理的CMakeLists.txt文件所在目录

        CMAKE_CURRENT_BINARY_DIR:cmake当前正在处理的二进制目录

        CMAKE_CURRENT_LIST_DIR:CMakeLists.txt的完整路径

        CMAKE_CURRENT_LIST_LINE:当前所在行

        CMAKE_C_FLAGS:设置C编译选项

        CMAKE_CXX_FLAGS:设置C++编译选项

        CMAKE_INSTALL_PREFIX:指定install指令安装文件的根目录

        EXECUTABLE_OUTPUT_PATH:生成目标可执行文件的输出位置

        LIBRARY_OUTPUT_PATH:库文件输出位置

    三:指令详解

             需要注意的是CMakeLists.txt文件中的指令不区分大小写 

(1)PROJECT(projectname [CXX] [C] [Java]):

该函数定义工程名字,并指定了工程的语言,支持语言的列表可以省略,默认情况下表示支持所有语言,并隐式定义了两个cmake的变量   

        PROJECT_BINARY_DIR:执行cmake的目录

        PROJECT_SOURCE_DIR:工程的根目录

(2).SET(<variable> <value>... [PARENT_SCOPE])

显式设置普通变量

        variable:只能有一个;
        value:可以有0个,1个或多个,当value值为空时,方法同unset,用于取消设置的值;
        PARENT_SCOPE(父作用域):作用域,除PARENT_SCOPE外还有function scope(方法作用域)和directory scope(目录作用域)。

     2.set(<variable> <value>... CACHE <type> <docstring> [FORCE]) #设置缓存条目

        variable:只能有一个
        value:可以有0个,1个或多个,当value值为空时,方法同unset,用于取消设置的值
        CACHE:关键字,说明是缓存变量设置
        type(类型):必须为以下中的一种:
                BOOL:有ON/OFF,两种取值
                FILEPATH:文件的全路径
                PATH:目录路径
                STRING:字符串
                INTERNAL:字符串
        docstring:总结性文字(字符串)
        [FORCE]:变量名相同,第二次调用set方法时,第一次的value将会被覆盖

     3.set(ENV{<variable>} [<value>]) #设置环境变量

        variable:只有一个

  value:一般来说,只有一个,为空时,将清除之前设置的变量值,多个时,取值最近的一个,之后的值将被忽略

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin):设置可执行文件的输出路径为build/bin

set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib):设置库文件的输出路径为build/lib

(3)include_directories(xxx)

                给工程添加头文件,例如使用opencv时需要包含/usr/local/include/opencv/cv.h这个头文件,则我们需要include_directories(/usr/local/include),在调用的函数里写 #include “opencv/cv.h”即可

        target_include_directories()

                为指定的目标添加搜索头文件

include_directories()和target_include_directories()区别

include_directories 会为当前CMakeLists.txt的所有目标,以及之后添加的所有子目录的目标添加头文件搜索路径。因此,慎用,会影响全局target

target_include_directories 只会为指定目标包含头文件搜索路径。如果想为不同目标设置不同的搜索路径,target_include_directories 更合适

例:target_include_directories(test xxx ${PROJECT_SOURCE_DIR}/include)

如果xxx为PRIVATE 则表示头文件只能由 test使用

如果xxx为INTERFACE 则表示头文件只能由 调用test的文件使用

如果xxx为PUBLIC 则test和任何调用test的文件都能使用头文件

(4)add_executable(可执行文件名 1.cpp 2.ppp …)

添加可执行文件,其中可执行文件需要用到1.cpp和2.cpp 工程会给1.cpp和2.cpp编译生成一个可执行文件

(5)add_library(生成的库名称 STATIC/SHARED 源文件.cpp)

将源文件生成 静态/动态 库文件 STSTIC 表示静态库最终会编入到可执行文件中,SHARED(常见参数)表示动态库(又称共享库)方式

(6)target_link_libraries (库/可执行文件 library1 library2 ...)

为库或者可执行文件添加需要链接的库

注:需要放在add_executable之后

(7)add_subdirectory(source_dir)

向当前工程添加存放其他源文件的子目录,用于多目录下都有CMakeLists.txt文件的情况

(8)aux_source_directory( 文件目录 变量名)

把文件目录下的所有源文件储存在变量中

例:aux_source_directory(${PROJECT_SOURCE_DIR}/ DIR_SRCS) 表示把工程目录的源文件添加到DIR_SRCS变量中

(9)message(模式 "output msg" )

打印输出信息,常见模式有FATAL_ERROR、WARNING、STATUS、DEBUG等

(10)find_package(<NAME> 版本号 EXACT/QUIET/REQUIRED)

version:指定查找库的版本号。 EXACT:要求该版本号必须精确匹配。 QUIET:禁掉没有找到时的警告信息。如果没找到则忽略这一问题,继续执行 REQUIRED选项表示如果包没有找到的话,CMake的过程会终止,并输出警告信息

当find_package找到一个库的时候,以下变量会自动初始化:

<NAME>_FOUND : 显示是否找到库的标记
<NAME>_INCLUDE_DIRS 或 <NAME>INCLUDES : 头文件路径
<NAME>_LIBRARIES 或 <NAME>_LIBS : 库文件 

注:如果CMake自动找不到路径,我们需要手动设置路径,如 先 set(OpenCV_INCLUDE_DIRS “home/hwh/Opencv3.1/build”) 设置路径 然后find_package(OpenCV 3.1 REQUIRED)

(11)file(GLOB 变量 "路径")

会在路径下查找目标文件并保存在变量中

(12)execute_process(COMMAND shell命令 WORKING_DIRECTORY shell命令的工作目录)

执行shell命令
(13)foreach(var ${list})

                xxx

          endforeach()

变量var从list中取值,并循环执行xxx命令

(14)install指令

install(TARGETS a.a b.so exe ARCHIVE a.a  DESTINATION lib/  LIBRARY b.so DESTINATION lib/ RUNTIME exe DESTINATION bin/)

TARGETS:通过ADD_EXECUTABLE ADD_LIBRARY定义的目标文件,ARCHIVE特指静态库,LIBRARY特指动态库,RUNTIME特指可执行目标二进制,DESTINATION定义了安装的路径

FILE:普通文件的安装

PROGRAMS :可执行脚本

DIRECTORY:目录安装

(15)add_definitions()

向编译器添加-D定义,如ADD_DEFINITIONS(-DENABLE_DEBUG -DABC),参数之间用空格隔开

如果代码中定义了#ifdef ENABLE_DEBUG #endif,这个代码块就会生效

如果要添加其他编译器开关,可以通过CMAKE_C_FLAGS变量和CMAKE_CXX_FLAGS变量设置

(16)ADD_DEPENDENCIES()

定义target依赖其他的target,确保在编译本target之前,其他的target以及被构建

(17)FILE()

文件操作指令

(18)include(file OPTIONAL)

用于载入CMakeLists.txt文件和.cmake文件,模块文件搜索路径与CMAKE_MODULE_PATH

变量指定的路径有关,OPTIONAL参数作用是即使文件不存在也不报错

(19)find_xxx(<VAR> name1 path1 path2)

查找相应的文件,VAR变量表示找到文件的全路径

(20)

function的定义格式如下:后面可作为命令供调用

function(<name> [<arg1> ...])

        <commands>

endfunction()

其中name是function的名字,参数为arg1, arg2等。

注意:变量的取值使用${},但在if控制语句中和直接使用变量名

                   Make VERBOSE=1可以看到makefile执行的详细步骤

                   CMAKE_INCLUDE_PATH 与CMAKE_LIBRARY_PATH是环境变量,两者都被用于find_path

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMakeLists.txt详解 的相关文章

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

    CMake是一种跨平台编译工具 xff0c 比make更为高级 xff0c 使用起来要方便得多 CMake主要是编写CMakeLists txt文件 xff0c 然后用cmake命令将CMakeLists txt文件转化为make所需要的m
  • 手把手教你使用CMake自动编译中CMakeLists.txt 怎么写

    背景 CMake 一直都是用别人的开源项目来编译 Makefile都是自己写 最近看zlm源码 里面用的CMake编译 比较简洁易懂 所以有尝试给现有项目也写个CMakeList txt来使用cmake自动编译 跟它耍耍 基础语法介绍 主要
  • Cmake知识----编写CMakeLists.txt文件编译C/C++程序

    简述 xff1a CMake是一个跨平台的安装 编译 工具 可以用简单的语句来描述所有平台的安装 编译过程 他能够输出各种各样的makefile或者project文件 能测试编译器所支持的C 43 43 特性 类似UNIX下的automak
  • 关于Cmake与CmakeLists(一)--背景,须知,示例

    一 背景及须知 1 背景 xff1a VS2019与VS2010在编写程序时都是创建了一个工程 xff0c 然后直接打开 sln即可 但是vscode仅仅是一个编辑器 xff0c 打开之后只有 c或者 cpp文件 xff0c 故需要手动编译
  • ROS Catkin 教程之 CMakeLists.txt

    1 概览 CMakeLists txt 是用 CMake 构建系统构建 ROS 程序包的输入文件 任何兼容 CMake 的包都包含一个或多个 CMakeLists txt 文件 xff0c 用以描述怎样构建和安装代码 catkin 项目采用
  • CMakeLists 理解

    CMakeLists 理解 最近发现其实之前对CMakeLists 理解不是很全面 xff0c 零零散散在网上看到的一些教程 xff0c 其实都是为了解决某个命令的问题 xff0c 要不然就是对一些命令的翻译理解 xff0c 实际上是很劝退
  • ROS CMakeLists.txt中的 target_link_libraries

    span class token function target link libraries span span class token punctuation span span class token punctuation span
  • ajax authorization,jquery ajax 添加自定义请求头 - Authorization 字段.txt

    jquery ajax 添加自定义请求头 Authorization 字段 txt 参考 xff1a https www cnblogs com yanggb p 12039665 html https www w3school com c
  • CMakeLists和makefile文件编写

    1 CMakeLists和makefile区别 xff1a CMake是一个跨平台的软件 xff0c 在很多平台可以使用 一般在windows下 xff0c 我们会直接使用VS生成项目 xff0c 在Linux下面 xff0c 我们也可以使
  • ORB_SLAM2 CMakeLIsts文件注释

    最近在学习ORB SLAM 发现基本找不到CMakeLists的代码注释 就决定自己注释一份 如果发现有问题的地方 欢迎和我交流 span class token function cmake minimum required span s
  • Cmakelists配置多级目录的gtest项目(项目代码和测试代码分离)

    cmake一些语法定义 之前的博客主要写了怎么配置gtest项目 xff0c 但是一般项目代码和测试代码并不在一起 xff0c 所以尝试将代码分离 主要分成三个部分 xff0c 下面给出demo的分级目录 gtest demo CMakel
  • gcc、make、makefile、cmake、cmakelists区别

    转自 xff1a http www zhihu com question 36609459 辉常哥 1 gcc是GNU Compiler Collection xff08 就是GNU编译器套件 xff09 xff0c 也可以简单认为是编译器
  • CMakeLists.txt中FIND_PACKAGE()是如何工作的?

    官方文档 xff1a https cmake org cmake help latest command find package html FIND PACKAGE lt PackageName gt 如何查找头文件和库文件路径 xff1
  • Cmakelists.txt添加.h和.cpp文件

    文件目录结构是这样 代码都是最基本的代码 仅仅是个小的demo cmakelists txt里面的内容 span class token comment cmake的版本要求 span cmake minimum required span
  • Makefile以及CMakelists的编辑

    1 概念 在linux中不像windows和mac有图形界面 xff0c 怎么快速的用命令行运行大型项目成为一个问题 xff0c 并且像c c 43 43 需要自己添加include文件的位置 xff0c 当文件数目变多的时候 xff0c
  • CMake与CMakeLists是干什么的?

    写在最前面 xff1a 所有的博文都是为了若干年月以后当我再次翻看可以快速回想起之前的零星知识 学海无涯 xff0c 在看这篇文章的未来的你 xff0c 加油吧 xff01 因为之前看到有些软件中使用了CMake xff0c 不太理解为什么
  • Java解析txt文件

    Java解析txt文件 package com wb test import java io BufferedReader import java io File import java io FileInputStream import
  • Windows从命令行创建文本文件的两种方式

    第一种方式 copy con 文件名 然后可以输入文件内容 完成后打Ctrl Z退出 输入的内容被保存为一个文件 第二种 如下 echo gt 文件名 创建一个空的文件 当然你可以创建任何后缀名的文本类文件 创建一个SQL文件也是没问题的
  • 如何在python中修改Yolo .txt文件的值

    我想修改包含 txt 文件的文件夹 txt 文件如下所示 3 0 695312 0 523958 0 068750 0 052083 3 0 846875 0 757292 0 071875 0 031250 3 0 830469 0 71
  • 使用powershell从txt文件中提取带有两个分隔符的列

    我有一个sample txt 文件 Processing Cl Cog u l Cg txt V DM Nv AL Ft He Se Fe Bt L Ey 0 Ct Cu3 我需要将此文件分成 4 个不同的列 并在之前添加新列 输出 csv

随机推荐

  • TRIZ创新方法——技术系统进化趋势

    技术系统进化趋势 技术系统及进化趋势S曲线法则技术系统的S曲线产品的进化曲线 八大技术系统进化法则 xff08 1 xff09 完备性法则 xff08 2 xff09 能量传递法则 xff08 3 xff09 协调性进化法则 xff08 4
  • 英特尔 NUC X15 笔记本 评测 英特尔上架新款 NUC X15 笔记本参数配置

    配置方面 xff0c 这款笔记本搭载了 i7 12700H 处理器 xff0c 14 核 20 线程 xff0c 睿频可达 4 7GHz 显卡为英特尔锐炫 A730M xff0c 搭载 24 个 Xe 内核 xff0c 拥有 12GB 19
  • vs2019未能正确加载解决方案的项目

    网上朋友们说是路径出了问题 xff0c 需要修改 vcxproj文件的内容 xff0c 我试了一下没成功 最后发现 xff0c 所以打不开 xff0c 是因为我下载了别人的项目 xff0c 用解压软件解压后直接打开了 sln 当我把解压后的
  • 自我提升解决bug的能力(一)

    我和大家分享一个我的自我提升解决bug的能力 满满的干货 一名优秀的程序员会具备较强解决bug的能力 如果你觉得自己不够优秀 xff0c 解决bug能力不足 xff0c 学习处于被动的状态 那我要大声的告诉你请不要迷茫 xff0c 陷入低沉
  • 论文笔记:VIBE: Video Inference for Human Body Pose and Shape Estimation

    要解决的问题 有3D关键点标注的数据集太少 xff0c 所以我们想生成这样的数据集 所以我们提出了一个 利用视频进行动作估计的新方法 xff0c 解决了数据集缺乏和预测准确率不佳的问题 主要创新点 利用 对抗式生成网络 来区分 真实人类动作
  • 2022年春招实习十四面(嵌入式面经)(已完结)

    文章目录 前言CVTE xff08 嵌入式软件 xff09 CVTE一面 xff08 嵌入式软件开发 xff09 时长 xff1a 50分钟CVTE二面 xff08 55分钟 xff09 阿里菜鸟网络 xff08 嵌入式软件 xff09 阿
  • 二分算法简单介绍

    二分算法 xff0c 顾名思义 就是把一组有序数据的搜索区域缩小一半 下面给大家举例说明一下 如何确定被缩小的搜索区间 原理分析 拿一个有序的整形数组来举例 int a 10 61 1 2 3 4 5 6 7 8 9 10 xff0c 在初
  • 论文投稿指南——中文核心期刊

    gt gt gt 深度学习Tricks xff0c 第一时间送达 lt lt lt 目录 xff08 一 xff09 国内三大核心 1 中文社会科学引文索引 xff08 CSSCI 南大核心 xff09 2 中国科学引文数据库 xff08
  • linux opendir(打开目录函数) readdir(读取目录函数) closedir(关闭目录函数)

    Linux下opendir readdir 和closedir 这三个函数主要用来遍历目录 在使用这三个函数前必须先包括以下两个头文件 xff1a include lt sys types h gt include lt dirent h
  • Cmakelists.txt 的基本框架

    执行 cmake 表示在当前目录下执行 cmake cmake 表示在前一级目录下执行 cmake make 在当前目录下执行 make 语法 1 设置 cmake 版本需求 cmake minimum required VERSION 2
  • UartAssist - 串口调试助手。

    由于项目需要用到串口 xff0c 所以我就找到一个简单易上手的串口调试助手 串口调试助手 1 助手界面 xff1a 2 设置串口 xff0c 点击 打开 3 设置发送区和接收区参数 4 输入发送内容 xff0c 点击 发送 即可
  • 网络摄像机rtsp地址详解。

    RTSP xff08 Real Time Streaming Protocol xff09 xff0c RFC2326 xff0c 实时流传输协议 xff0c 是TCP IP协议体系中的一个应用层协议 xff0c 由哥伦比亚大学 网景和Re
  • Qt 登陆界面实现

    简单的QT用户登录界面 一 项目描述 在登录界面输入用户名和密码正确之后才进入欢迎界面 用户名 xff1a xiaoxian 密码 xff1a 1240 二 效果图 三 源代码 loginform span class token punc
  • FFMPEG保存视频流数据至本地(rtsp转mp4)

    将rtsp流中的h264视频流在没解码之前获取下来 xff0c 并保存到本地文件mp4中的h264流中 xff0c h264 gt mp4 网络摄像机rtsp地址详解 流程图 xff1a 源码 xff1a span class token
  • Qt + FFmpeg实现播放器(FFmpeg可以解码的格式基本都可以播放)。

    一 开发环境的准备 Linux下移植ffmpeg开源库 二 代码实现播放功能 1 打开音视频流并获取音视频流信息 xff1b 2 查找视频流位置以及查找并打开视频解码器 xff1b 3 视频解码的同时处理图片像素数据 xff1b 4 最后要
  • SecureCRT 下的串口不能输入指令。

    1 在 SecureCRT 下的串口不能输入指令 解决方法 xff1a Session Options gt Connection gt Serial gt Flow Control xff0c 将原先默认选中的 RTS CTS取消掉即可
  • Qt实现简单密码登陆界面

    效果图 xff1a 代码实现 span class token macro property span class token directive hash span span class token directive keyword i
  • error: ‘uint8_t’,‘uint32_t’ does not name a type

    c 43 43 里用了c的代码 xff0c 确切的说 xff0c 是引用了c写的x264 h xff0c 结果报错了 xff1a 解决方法 xff1a span class token macro property span class t
  • gitlab 同时拉取整个项目

    一 xff1a 下载repo工具包 下载地址 xff1a GitHub NeutionWei repo unzip repo 刚下载的repo包解压 xff0c 其中的repo只是一个几百行的脚本 xff0c 需要repo init才可以获
  • CMakeLists.txt详解

    一 xff1a CMakeLists txt文件是cmake用来生成Makefile文件需要的一个描述编译链接的规则文件 学习cmake需要提前了解gcc等编译命令 xff0c 先来解释一条最简单的命令 gcc source c o bin