CMakeLists入门

2023-05-16

目录

    • 基础
    • 增加依赖库
    • 将 .cpp文件 编译成一个库,供其他文件调用:
    • 变量名
    • list
    • 自动检测编译器是否支持C++11
    • add_definitions
    • include_directories
    • target_include_directories
  • 参考

基础

首先构建一个CMake目录。ubuntu下的CMake项目通常有几个文件夹组成。
一般

  • bin文件夹用来存放编译好的可执行二进制文件
  • src用来放源代码
  • lib用来放编译好的库文件
  • include用来放头文件

基本的CMakeLists.txt:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8) # 设定版本
PROJECT(git_test) # 设定工程名
set(CMAKE_CXX_COMPILER "g++") # 设定编译器

#设定可执行二进制文件的目录
SET( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

#设定存放编译出来的库文件的目录
SET( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

#并且把该目录设为连接目录
LINK_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib)
#link_directories()

#设定头文件目录
INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include)
#include_directories()

#增加子文件夹,也就是进入源代码文件夹继续构建
ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src)

增加依赖库

# 增加PCL库的依赖
FIND_PACKAGE( PCL REQUIRED COMPONENTS common io )

# 增加opencv的依赖
FIND_PACKAGE( OpenCV REQUIRED )

# 将 -D 定义标志添加到源文件的编译中。
# 例如在编译某些项目源码的时候,有提示可以使用相关cmake设置,指令使用方式为 cmake -DTHIRD_PARTY_MIRROR=aliyun .. 
ADD_DEFINITIONS( ${PCL_DEFINITIONS} )
#设定头文件目录
INCLUDE_DIRECTORIES( ${PCL_INCLUDE_DIRS}  )
# link_libraries用来链接静态库,target_link_libraries用来链接导入库
LINK_LIBRARIES( ${PCL_LIBRARY_DIRS} )

# 增加一个可执行的二进制
ADD_EXECUTABLE( generate_pointcloud generatePointCloud.cpp )

TARGET_LINK_LIBRARIES( generate_pointcloud ${OpenCV_LIBS} 
    ${PCL_LIBRARIES} )
# 可以在find_package()前设定_DIR,指向包含Config.cmake或-config.cmake的目录。
# _ROOT先设定,再设定_DIR,最后find_package();并且两个都能找到包,则_DIR起作用
set(OpenCV_ROOT "/home/nio/3rdparty/opencv-4.4.0/build")
set(OpenCV_DIR "/home/nio/3rdparty/opencv-4.4.0/build")

# 查找PCL库(查找依赖包)
# find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
# version和EXACT: 都是可选的,version指定的是版本,如果指定就必须检查找到的包的版本是否和version兼容。如果指定EXACT则表示必须完全匹配的版本而不是兼容版本就可以。
# QUIET 可选字段,表示如果查找失败,不会在屏幕进行输出(但是如果指定了REQUIRED字段,则QUIET无效,仍然会输出查找失败提示语)
# MODULE 可选字段。前面提到说“如果Module模式查找失败则回退到Config模式进行查找”,但是假如设定了MODULE选项,那么就只在Module模式查找,如果Module模式下查找失败并不回落到Config模式查找。
# REQUIRED可选字段。表示一定要找到包,找不到的话就立即停掉整个cmake。而如果不指定REQUIRED则cmake会继续执行。
FIND_PACKAGE( PCL REQUIRED COMPONENTS common io )

# find_package()会把一整个依赖包的头文件包含路径、库路径、库名字、版本号等情况都获取到
# message 输出信息
message(STATUS "OpenCV library status:")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")

# 增加opencv的依赖
FIND_PACKAGE( OpenCV REQUIRED )

# 添加头文件和库文件
# add_definitions()
ADD_DEFINITIONS( ${PCL_DEFINITIONS} )
INCLUDE_DIRECTORIES( ${PCL_INCLUDE_DIRS}  )
LINK_LIBRARIES( ${PCL_LIBRARY_DIRS} )

ADD_EXECUTABLE( test2 test2.cpp )
TARGET_LINK_LIBRARIES( test2
        ${OpenCV_LIBS}
        ${PCL_LIBRARIES} )


将 .cpp文件 编译成一个库,供其他文件调用:

ADD_LIBRARY( slambase slamBase.cpp )
TARGET_LINK_LIBRARIES( slambase
    ${OpenCV_LIBS} 
    ${PCL_LIBRARIES} )
add_library(<name> [STATIC | SHARED | MODULE]   [EXCLUDE_FROM_ALL] source1 [source2 ...])
  • <name> :库的名字,直接写名字即可,不要写lib,会自动加上前缀的哈。

  • [STATIC | SHARED | MODULE] :
    SHARED: 动态库
    STATIC: 静态库
    MODULE: 在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待。

  • EXCLUDE_FROM_ALL:这个库不会被默认构建,除非有其他的组件依赖或者手
    工构建。

变量名

PROJECT_SOURCE_DIR : 使用cmake命令后紧跟的目标,一般是工程的根目录
PROJECT_BINARY_DIR : 执行cmake命令的目录,通常是${PROJECT_SOURCE_DIR}/build
CMAKE_INCLUDE_PATH : 系统环境变量,非cmake变量
CMAKE_LIBRARY_PATH:系统环境变量,非cmake变量
CMAKE_CURRENT_SOURCE_DIR:当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_BINARY_DIR:target编译目录(使用ADD_SURDIRECTORY(src bin)可以更改此变量的值 ,SET(EXECUTABLE_OUTPUT_PATH <新路径>)并不会对此变量有影响,只是改变了最终目标文件的存储路径)
CMAKE_CURRENT_LIST_FILE:输出调用这个变量的CMakeLists.txt的完整路径
CMAKE_CURRENT_LIST_LINE:输出这个变量所在的行
CMAKE_MODULE_PATH:定义自己的cmake模块所在的路径(这个变量用于定义自己的cmake模块所在的路径,如果你的工程比较复杂,有可能自己编写一些cmake模块,比如SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块)
EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置
PROJECT_NAME:返回通过PROJECT指令定义的项目名称CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS:用来控制IF ELSE语句的书写方式
CMAKE_MAJOR_VERSION:make主版本号,如3.4.1中3
CMAKE_MINOR_VERSION:cmake次版本号,如3.4.1中的4
CMAKE_PATCH_VERSION:cmake补丁等级,如3.4.1中的1
CMAKE_SYSTEM:操作系统名称,包括版本名,如Linux-2.6.22
CAMKE_SYSTEM_NAME:操作系统名称,不包括版本名,如Linux
CMAKE_SYSTEM_VERSION:操作系统版本号,如2.6.22
CMAKE_SYSTEM_PROCESSOR:电脑处理器名称,如i686
UNIX:在所有的类UNIX平台为TRUE,包括OS X和cygwin,Linux/Unix操作系统
WIN32:在所有的win32平台为TRUE,包括cygwin,Windows操作系统
APPLE:苹果操作系统;

list

list (subcommand <list> [args...])
  • subcommand为具体的列表操作子命令,例如读取、查找、修改、排序等。
  • <list>为待操作的列表变量
  • [args…]为对列表变量操作需要使用的参数表,不同的子命令对应的参数也不一致。

自动检测编译器是否支持C++11

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
    message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()

add_definitions

add_definitions的功能和C/C++中的#define是一样的
比如我有如下两个文件,一个源文件main.cpp,一个CMakeLists.txt
源文件main.cpp

#include <iostream>
int main()
{
#ifdef TEST_IT_CMAKE
	std::cout<<"in ifdef"<<std::endl;
#endif
	std::cout<<"not in ifdef"<<std::endl;
}

cmake文件CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(optiontest)

add_executable(optiontest main.cpp)
option(TEST_IT_CMAKE "test" ON)
message(${TEST_IT_CMAKE})
if(TEST_IT_CMAKE)
	message("itis" ${TEST_IT_CMAKE})
	add_definitions(-DTEST_IT_CMAKE)
endif()

通过option设置一个变量,并通过add_definitions将其转换为#define TEST_IT_CMAKE

  • 当变量为ON时 option(TEST_IT_CMAKE "test" ON)

该程序的输出是

in ifdef
not in ifdef
  • 当变量为OFF时 option(TEST_IT_CMAKE "test" OFF)

该程序的输出为

not in ifdef

include_directories

将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径。
语法格式:

include_directories ([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

默认情况下,include_directories命令会将目录添加到列表最后(AFTER选项)。不过,可以通过命令设置CMAKE_INCLUDE_DIRECTORIES_BEFORE 变量为ON来改变它的默认行为,将目录添加到列表前面。也可以在每次调用include_directories命令时使用AFTER或BEFORE选项来指定是添加到列表的前面或者后面。如果使用SYSTEM选项,会把指定目录当成系统的搜索目录。该命令作用范围只在当前的CMakeLists.txt。

例如,在Linux下,C编译器默认搜索路径:

/usr/include
/usr/local/include

如果我们项目根目录下,有个公共头文件目录include1、include2需要添加到C编译器的默认搜索路径,可以在CMakeLists.txt中添加:

include_directories(include1) # 注意当前CMakeLists.txt和include1相对路径关系, 此时必须是在同一个目录下
include_directories(${PROJECT_SOURCE_DIR}/include2) # 通过源码根目录来定位include2

target_include_directories

为指定目标(target)添加搜索路径,指定目标是指通过如add_executable(),add_library()这样的命令生成的,并且决不能是alias target(引用目标,别名目标)。
语法格式:

target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]  <INTERFACE|PUBLIC|PRIVATE> [items1...]  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

参考

https://blog.csdn.net/qq_35699473/article/details/115837708
https://www.cnblogs.com/fortunely/p/16297077.html

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

CMakeLists入门 的相关文章

  • EGO Planner代码解析----CMakeLists.txt和package.xml

    ROS本质上就是由一个又一个的package组成的 xff0c package可以说是ROS的细胞 在catkin make的时候它会一个一个的去找package然后生成目标文件 一个package可以有多个节点 判断是否为Package
  • CmakeLists所遇命令用法总结

    1 option命令 xff1a 形式 xff1a option lt variable gt 34 lt help text gt 34 value 简介 xff1a cmake中option起到编译开关的作用 xff0c CMakeLi
  • CMakeLists文件的编译

    文章目录 CMakeLists的编译CMakeLists编译原理 文件路径 xff1a 编写CMakeLists txt CMakeLists常用命令 CmkeLists的基本步骤1 1 CMake版本1 2 软件包名称1 3 查找相关的C
  • Android.mk 和 CMakeLists.txt 的转换规则

    Android mk 和 CMakeLists txt 都是用来构建 Android 应用程序或库的工具 但是它们有不同的语法和规则 xff0c 所以将一个 Android mk 文件转换成一个 CMakeLists txt 文件需要一些注
  • CMakeLists.txt详解

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

    27条消息 PX4 CMakeLists txt 文件剖析 lipi37的博客 CSDN博客 px4 cmake makefile介绍 跟我一起写Makefile 1 0 文档 seisman github io 57条消息 PX4编译文件
  • CMakeLists笔记

    CMakeLists笔记 一 路径名二 函数三 常用 一 路径名 PROJECT SOURCE DIR xff1a 一般为catkin ws src xff0c 是cmakelists的绝对路径PROJECT BINARY DIR xff1
  • 【CMake】CMakeLists.txt的超傻瓜手把手教程(附实例源码)

    新手写CMakeLists txt简直就是实力劝退 xff0c 各种命令让很多人头大 xff0c 如何写一个最基础的CMakeLists txt呢 xff1f 本文从一个实例出发 xff0c 教你编写的基本流程 CMakeLists txt
  • ros2 CMakeLists.txt与packages.xml写法

    注 xff1a 尽量使用ament cmake auto来编写cmakelists txt文件 xff0c 依赖的程序包在packages xml文件中用 lt depend gt nav msgs lt depend gt 的形式声明 x
  • CMakeLists.txt ----find_package

    在linux平台下编译程序的时候通常都会使用到CMakeLists txt来制定编译规则 在查找需要链接的lib时候 通常会使用到find package 记录一下我之前用到的地方 find package 之后 最好到FindXXX cm
  • CMakeLists.txt----一点儿自己的经验教训

    被CMakeLists txt坑过数次 xff08 大多是被自己蠢哭 xff09 xff0c 把用过的命令稍微记一下 注意 xff1a 中文空格等什么诡异字符 xff0c 链接库的名字不要忘记 xff0c 不要写错 好记性不如烂键盘 xff
  • CMakeLists

    1 指定 cmake 的最小版本 cmake minimum required VERSION 3 4 1 2 设置项目名称 xff0c 它会引入两个变量 demo BINARY DIR 和 demo SOURCE DIR xff0c 同时
  • cmake中多级CMakeLists.txt调用

    文章目录 一 工程目录结构二 工程源代码2 1 上层目录2 1 1 cmaketest CMakeLists txt2 1 2 cmaketest main cpp2 1 3 cmaketest inc func1 hpp2 1 4 cma
  • 手把手教你使用CMake自动编译中CMakeLists.txt 怎么写

    背景 CMake 一直都是用别人的开源项目来编译 Makefile都是自己写 最近看zlm源码 里面用的CMake编译 比较简洁易懂 所以有尝试给现有项目也写个CMakeList txt来使用cmake自动编译 跟它耍耍 基础语法介绍 主要
  • ros里Catkin的CMakelists/package.xml

    Catkin是基于CMake的编译构建系统 xff0c 具有以下特点 xff1a Catkin沿用了包管理的传统像 find package 基础结构 pkg config扩展了CMake xff0c 例如 软件包编译后无需安装就可使用 自
  • ROS Catkin 教程之 CMakeLists.txt

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

    CMakeLists 理解 最近发现其实之前对CMakeLists 理解不是很全面 xff0c 零零散散在网上看到的一些教程 xff0c 其实都是为了解决某个命令的问题 xff0c 要不然就是对一些命令的翻译理解 xff0c 实际上是很劝退
  • qt程序的CMakeLists.txt配置转为平台的qt的.pro项目工程文件

    参考这个 跨平台qt程序的CMakeLists txt配置转为平台的qt的 pro项目工程文件 谁能懂我2011的博客 CSDN博客 一些比较正规的跨平台qt项目没有 pro项目文件只有CMakeLists txt文件 xff0c 如果要编
  • 关于GD32的CMakeLists以及gcc部分编译选项的解释

    set CMAKE SYSTEM NAME Generic cmake最低版本 cmake minimum required VERSION 3 0 0 工程名称 语言 project TEST PRJ NAME LANGUAGES C C
  • ROS2 + Qt5 cmake的CMakeLists.txt文件配置

    ROS2 QT实现学习笔记 1 1 功能包的创建和编译 ROS2 Foxy 43 Qt5 on Linux Platform 按上面两个文章配置后的目录结构 build CMakeLists txt include mainwindow h

随机推荐

  • Oracle创建新用户

    Oracle 创建新用户 SQL语句 span class token operator span span class token operator span span class token operator span 创建用户 cre
  • Centos8.2安装配置 VNC 远程桌面Xfce、解决输入法VNC无法使用的问题、解决浏览器无法播放视频的问题

    本文使用MobaXterm Xshell Xfce TightVNC来搭建百度智能云Centos8 2 同时解决解决输入法VNC无法使用的问题 解决浏览器无法播放视频的问题 目录 一 Windows软件列表 MobaXterm TightV
  • python自定义函数 def 的奇妙世界

    自定义函数 def注意事项案例分析作死挑战函数参数形参与实参位置参数关键字参数默认参数必选参数可变参数可变关键字参数 参数问题解答 这里是三岁 xff0c 来和大家唠唠自定义函数 xff0c 这一个神奇的东西 xff0c 带大家白话玩转自定
  • Qt 怎么设置黑色背景/黑色主题?

    目录 整体分为三步1 更改主题颜色1 1 更改颜色 xff1a 1 2 重启 Qt1 3 第一阶段完成 xff0c 效果如下所示 2 更改编辑器颜色2 1 更改颜色2 2 第二阶段完成 xff0c 效果如下所示 3 更改 Qt 窗口上边框颜
  • YOLOv4在ROS-Melodic上的部署-libtorch(附源码,非Darknet)

    有关YOLOv4 LibTorch的部署可以看我的这篇博客 然后移植到ROS Melodic上就相对简单了 直接上GitHub链接吧 初版可能有点乱 xff0c 但是注释挺详细 xff0c 欢迎交流经验哈 2020 12 16 更新 YOL
  • 手把手安装Windows11虚拟机

    创建虚拟机 想要在虚拟机当中安装windows11系统 xff0c 首先我们就要在Vmware中创建一个虚拟机 这个操作比较简单 xff0c 只需要打开新建虚拟机向导 xff0c 按照提示操作就可以了 在创建虚拟机的时候 xff0c 安装w
  • C++ 学习过程中遇到的难题及解决 (笔记,随更

    C 43 43 报错表达式必须含有常量值 原因 xff1a c 43 43 中不允许使用变量作为数组的长度定义数组 xff0c 必须为常量值 xff0c c 43 43 中所有的内存需求都是在程序执行前通过定义的常量来确定的 C 43 43
  • 一篇文章快速提高Python能力

    确实当你学了Python的一段时间之后会有一阵不知道如何更快的提高自己的功力 其实Python也是语言的一种 xff0c 虽然语法很简单 xff0c 但是内涵真的很丰富 xff0c 招式非常的多 修炼武功我个人觉得分几个层次 第一招是语法
  • python 图形界面库对比合集

    从 Python 语言的诞生之日起 xff0c 就有许多优秀的 GUI 工具集整合到 Python 当中 xff0c 这些优秀的 GUI工具集 xff0c 使得 Python 也可以在图形界面编程领域当中大展身手 xff0c 由于 Pyth
  • TensorFlow深度学习及教程分享

    TensorFlow深度学习框架 Google不仅是大数据和云计算的领导者 xff0c 在机器学习和深度学习上也有很好的实践和积累 xff0c 在2015年年底开源了内部使用的深度学习框架TensorFlow 与Caffe Theano T
  • Python 中国象棋源码 V1

    Pygame 做的中国象棋 xff0c 一直以来喜欢下象棋 xff0c 写了 python 就拿来做一个试试 xff0c 水平有限 xff0c 电脑走法水平低 xff0c 需要在下次版本中更新电脑走法 xff0c 希望源码能帮助大家更好的学
  • python数据爬下来保存在哪里

    昨天下班后忽然兴起想写一个爬虫抓抓网页上的东西 花了一个钟简单学习了python的基础语法 xff0c 然后参照网上的例子自己写了个爬虫 xff08 推荐学习 xff1a Python视频教程 xff09 python数据爬下来保存在本地
  • python求平均值

    python求平均值 首先我们先来了解一下计算平均数的IPO模式 输入 xff1a 待输入计算平均数的数 处理 xff1a 平均数算法 输出 xff1a 平均数 推荐 xff1a python教程 明白了程序的IPO模式之后 xff0c 我
  • 如何用for循环实现一个无限循环

    使用while True可以轻松的实现一个无限循环 xff0c 也叫死循环 xff0c 那么for循环能够实现类似的功能么 xff1f 当然可以 xff0c 借助itertools模块的cycle函数就可以 import time from
  • 闲得发慌之趣味技能:python之猫脸检测

    Python 小猫检测 xff0c 通过调用opencv自带的猫脸检测的分类器进行检测 分类器有两个 xff1a haarcascade frontalcatface xml和 haarcascade frontalcatface exte
  • 目标检测性能的衡量指标:mAP图解

    最近又重新复习了下mAP xff0c 在网上找了有关mAP的文章 xff0c 但是感觉大多数都是左抄一点又抄一点那种 写的比较乱 xff0c 可能因为mAP的计算方法前后变过几次 xff0c 所以导致有很多版本的说法存在 为了更好的理解 x
  • 热门编程——python

    python是干什么的 xff1f 要找出python火爆的原因 xff0c 我们就不得不先来了解python本身 Python 是一种面向对象的解释型计算机程序设计语言 xff0c 由荷兰人 Guido van Rossum 于 1989
  • Python求两个数的最大公约数

    一 求最大公约数算法 整数A对整数B进行取整 余数用整数C来表示 举例 C 61 A B 如果C等于0 则C就是整数A和整数B的最大公约数 如果C不等于0 将B赋值给A 将C赋值给B 然后进行 1 2 两步 直到余数为0 则可以得知最大公约
  • VINS-MONO学习笔记 [基于滑动窗口的非线性优化]

    目录 1 代码2 ceres解析求导3 ceres李代数加法代码实现4 预积分约束残差计算5 预积分雅克比计算6 视觉重投影约束7 滑动窗口边缘化 1 代码 代码位置 xff1a vins estimator gt src gt estim
  • CMakeLists入门

    目录 基础增加依赖库将 cpp文件 编译成一个库 xff0c 供其他文件调用 xff1a 变量名list自动检测编译器是否支持C 43 43 11add definitionsinclude directoriestarget includ