CMAKE学习笔记

2023-05-16

文章目录

  • CMAKE常用指令
    • CMake最低版本要求
    • 项目名称
    • 设置编译方式
    • 编译CXX的设置标志
    • 搜索外部库
    • 添加源文件子目录
    • ?查找源文件
    • 生成可执行文件
    • 生成链接库文件
    • 为可执行文件链接库
    • 指定头文件搜索路径
    • SET定义变量
    • LIST列表操作
    • 判断语句
    • 循环语句
  • 使用注意事项
  • 实例

CMAKE官方文档:https://cmake.org/cmake/help/latest/genindex.html#

CMAKE常用指令

CMake最低版本要求

CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )

项目名称

PROJECT(  项目名称  )  

定义的项目名称存放到了变量 ${PROJECT_NAME}中。
包含CMakeLists.txt所在的文件夹目录路径存放到了变量 ${PROJECT_SOURCE_DIR}中。
${ } 来引用变量

设置编译方式

SET( CMAKE_BUILD_TRPE Release )

编译方式有以下几种:
● Debug:调试模式,输出调试信息,不做优化
Release:发布模式,没有调试信息,全优化
● RelWithDeblnfo:类似Release,但包括调试信息
● MinSizeRel:一种特殊的Release模式,会特别优化库的大小

编译CXX的设置标志

SET ( CMAKE_CXX_FLAGS " -Wall  " )

编译CXX时需要优化的配置,比如:
● -std=c++11:支持C++11
● -Wall:编译过程输出警告
● -O3:优化,提高代码速度
语句会覆盖CMakeLists.txt中前面的标志,如果要追加配置,要用在双引号里面追加之前的变量 ${CMAKE_CXX_FLAGS}

SET ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall" )

搜索外部库

//查找系统OpenCV3以上版本

FIND_PACKAGE( 外部库 版本 EXACT/QUIET/REQUIRED )
FIND_PACKAGE( OpenCV 3 REQUIRED )

参数意义:
● EXACT:要求该版本号必须精确匹配。
● QUIET:禁掉没有找到时的警告信息。
REQUIRED:版本至少在这个之上。如果包没有找到时,CMake会终止并输出警告信息。
找到包以后,下面的变量会自动初始化:
${<NAME>_FOUND} :显示是否找到库的标记。
${<NAME>_INCLUDE_DIRS}${<NAME>_INCLUDES} :就是 的头文件路径(对应库的include)。
${<NAME>_LIBS}${<NAME>_LIBRARIES} :库文件
FIND_PACKAGE两种寻找模式:

  1. Module模式:搜索 ${CMAKE_MODULE_PATH}指定路径下的FindXXX.cmake文件,执行改文件从而找到XXX库。其中,具体查找库并给 ${XXX_INCLUDE_DIRS}${XXX_LIBRARIES}两个变量赋值的操作均由FindXXX.cmake完成。
  2. Config模式:搜索 ${XXX_DIR} 指定路径下的XXXConfig.cmake文件从而找到XXX库。其中具体查找库并给${XXX_INCLUDE_DIRS}${XXX_LIBRARIES} 两个变量赋值的操作均由XXXConfig.cmake完成。如果${XXX_DIR}下未找到XXXConfig.cmake文件,则会找/usr/local/lib/cmake/XXX/目录下是否存在。如果库安装时没有安装到系统目录,则无法自动找到XXXConfig.cmake,需要手动添加搜索路径:
SET( XXX_DIR /home/nvidia/opencv/build )

● 注意:两种模式默认采用Module模式,如果未找到库,才会采取Config模式。

添加源文件子目录

ADD_SUBDIRECTORY( 子目录 )

目录可以使相对路径也可以是绝对路径。
之后,${CMAKE_SOURCE_DIR} 为源文件所在的绝对路径。

?查找源文件

AUX_SOURCE_DIRECTORY( 目录 文件名 )

生成可执行文件

ADD_EXECUTABLE( 可执行文件名  源文件 )

之后,${EXECUTABLE_OUTPUT_PATH}为可执行文件输出路径。

生成链接库文件

ADD_LIBRARY( 库文件名 STATIC/SHARED  源文件 )

STATIC表示静态链接库,SHARED表示共享链接库。
之后,${LIBRARY_OUTPUT_PATH} 为库文件输出路径。

静态库
● 原理:在编译时将源代码复制到程序中,运行时不用库文件依旧可以运行
● 优点:运行已有代码,运行时不用再用库;无需加载库,运行更快
● 缺点:占用更多的空间和磁盘;静态库升级,需要重新编译程序

动态库
● 原理:编译时仅仅记录用哪一个库里面的哪一个负号,不复制相关代码
● 优点:不复制代码,占空间小;多个程序可以同时调用一个库;升级方便,无需重新编译
● 缺点:程序运行需要加载库,耗费一定时间

为可执行文件链接库

TARGET_LINK_LIBRARIES( 可执行文件 库 )

指定头文件搜索路径

INCLUDE_DIRECTORIES( /usr/local/include )

.cpp 文件要引用头文件时,在设置的目录下搜索。

SET定义变量

SET( 变量 值 )
SET( SRC_LST main.cpp other.cpp )

用变量代替值,上面的语句意思是用变量SRC_LST代替后面两个cpp

LIST列表操作

LIST( 参数 <list> 内容 )

常用的参数有:
APPEND:对追加 内容
● FILTER
● GET
● LENGTH
● JOIN
● SUBLIST
● FIND
● INSERT

判断语句

IF
ELSEIF
ENDIF

与C语言使用相同。

循环语句

FOREACH( <loop_var> <items> )
FOREACH( i 0 1 2 3 )
    message(STATUS "current is ${i} " )
ENDFOREACH(i)

使用注意事项

● 工程存在多个目录,可以每个目录都放一个CMakeLists.txt,也可以只用一个CMakeLists.txt。
● 指令不区分大小写

实例

一个图像去畸变函数,结构如下:
● include/base.h(opencv required)
● src/undistort.cpp(base.h opencv required)
● test/main.cpp
其中,main中调用undistort中函数,undistort需要链接opencv。
CMakeLists.txt如下:

# CMake 最低版本号要求
cmake_minimum_required( VERSION 2.8 )

# 项目名称
project( image_undistort )

# 设置编译方式
set( CMAKE_BUILD_TYPE Release )

#支持C++11
set( CMAKE_CXX_FLAGS "-std=c++11" )

# 查找系统里的OpenCV
find_package( OpenCV 3 REQUIRED )

# 添加项目包含路径
include_directories( 
	${PROJECT_SOURCE_DIR}/include/
	${OpenCV_INCLUDE_DIRS} 
	)

message("PROJECT_SOURCE_DIR = " ${PROJECT_SOURCE_DIR})
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
set(LIBRARY_OUTPUT_PATH  ${CMAKE_BINARY_DIR}/lib)
message("CMAKE_BINARY_DIR = " ${CMAKE_BINARY_DIR})
message("CMAKE_SOURCE_DIR = " ${CMAKE_SOURCE_DIR})

# 将指定的源文件生成链接库文件。STATIC 为静态链接库,SHARED 为共享链接库
add_library(lib_undistort ${PROJECT_SOURCE_DIR}/source/undistort.cpp)

# 为库或可执行文件添加库链接
target_link_libraries( lib_undistort
	${OpenCV_LIBS}
	)

# 用指定的源文件为工程添加可执行文件,名字为undistort_image
add_executable( ${PROJECT_NAME} ${PROJECT_SOURCE_DIR}/testBed/main.cpp )

# 为库或可执行文件添加库链接
target_link_libraries( ${PROJECT_NAME}
	${OpenCV_LIBS}
	lib_undistort 
	)

首先第一部分,cmake版本、工程名、编译方式、CXX_FLAG
第二部分,查找第三方库、设置包含路径、设置bin或lib文件输出路径
第三部分,生成库、为库链接、生成可执行文件、为可执行文件链接

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

CMAKE学习笔记 的相关文章

  • 关于stm32中串口重定向问题详解(找个时间好好理解下)

    usart这部分代码我也是从网上copy出来的 xff0c 一下是作者的解释 xff1a 简单地说 xff1a 想在mdk 中用printf xff0c 需要同时重定义fputc函数和避免使用semihosting 半主机模式 xff09
  • http解析库http-parser

    一 http parser简介 1 简介 http parser是一个用C编写的HTTP消息解析器 xff0c 可以解析请求和响应 xff0c 被设计用于高性能HTTP应用程序 它不会进行任何系统调用及内存分配 xff0c 它不会缓冲数据
  • centos系统重置root密码,忘记密码修改

    1 开机按下Ecs键 xff0c 进入如下界面 2 根据需要选择系统内核版本并按e键 3 光标移动到 linux 16 开头的行 xff0c 找到 ro 改为 rw init 61 sysroot bin sh xff1b 4 按 Ctrl
  • summary1 如何在Python中创建基本的ROS节点[AI]

    本课程结束时 xff0c 您将能够 xff1a 1 在模拟中 xff0c 使用ROS控制TurtleBot3机器人 2 使用roslaunch和rosrun启动ROS应用程序 3 使用关键ROS命令行工具询问正在运行的ROS应用程序 4 创
  • switch case语句用法

    一般情况下 xff0c 判断语句常用的有if else xff0c 三目运算符 xff0c 还有switch case等 xff0c 根据不同需求使用其判断语句 下面以简单示例展示 xff1a 在输入框中输入数字 xff0c 判断其星期几
  • 四轴飞行器基础

    原文知识来自果壳网 四轴飞行器基础篇 xff0c 进行一些适量增删 基本原理与名词解释 1 遥控器篇 通道 通道就是可以遥控器控制的动作路数 xff0c 比如遥控器只能控制四轴上下飞 xff0c 那么就是1个通道 但四轴在控制过程中需要控制
  • OPENWRT,爱快等软路由推荐

    这种用于路由器的开源固件 操作系统可以让它获得大多数路由器所不具备的功能 xff0c 甚至可以把一台旧PC变成强大的路由器或防火墙设备 软路由提供的一些特性和功能包括带宽监控 VLAN支持 高级无线设置 VPN集成 高级安全等等 在这篇文章
  • freeRTOS 时间管理

    1 相对时间延时 br vTaskDelay gt prvAddCurrentTaskToDelayedList 函数分析之后 xff0c 有步骤解析 br 为什么使用两个延时列表 xff1f br br br 2 绝对时间延时 br Pr
  • 美团笔试题_20220409

    前言 笔试一共五道编程题 xff08 四 43 一 xff09 xff0c 一为专项编程题 xff0c 估计不同岗位有题目不一样 xff0c 使用的是赛码网 xff0c 允许跳出界面使用自己的IDE 在此感谢筱羊冰冰提供的部分题目及题解 题
  • 最简单的socket 与物流网的传感器交换数据

    做个笔记 最简单的socket 要与物流网的传感器交换数据 登录分为用户登录 与 设备登录 1 用户登录 xff08 SSLSOCKET xff09 M login ID xx1 K xx2 n json格式 最简单的SSLSocket 基
  • 如何开发出成功的硬件产品,一个产品由概念的产生到产品的落地量产又需要经历哪些流程呢?

    对于一个硬件产品而言 xff0c 大批量的生产交付才能实现其最大的商业价值 然而 xff0c 不同于软件产品的复制升级 xff0c 硬件产品大批量生产背后所涉及的生产制造 工艺测试 品质功能 可靠性 成本等等一系列问题 xff0c 都是一个
  • 进程切换与线程切换的区别

    一 虚拟内存知识复习 虚拟内存是操作系统为每个进程提供的一种抽象 xff0c 每个进程都有属于自己的 私有的 地址连续的虚拟内存 xff0c 当然我们知道最终进程的数据及代码必然要放到物理内存上 xff0c 那么必须有某种机制能记住虚拟地址
  • eclipse-tomcat解决java.lang.OutOfMemoryError: PermGen space

    在eclipse中使用tomcat启动项目的时候 遇到问题 xff0c 报错 xff1a java lang OutOfMemoryError PermGen space 原因很简单 内存溢出 xff0c 解决方法 1 双击红色部分 2 单
  • JavaWeb项目中加入redis缓存

    关于redis缓存的优缺点不再多做结束 xff0c 请自行上网查询 1 下载 xff1a windows版本资源我已经上传 xff0c 链接 xff1a http download csdn net detail kkkder 963718
  • java 格式化时间

    public static void main String args System out println System currentTimeMillis SimpleDateFormat formatter 61 new Simple
  • linux docker删除镜像

    springcloud参考指南下载 xff1a http download csdn net download kkkder 10035750 之前的没有接触的docker xff0c 找了些文档 xff0c 按部就班的在linux下安装部
  • springboot activiti工作流简单示例

    最近一直研究springboot xff0c 根据工作需求 xff0c 工作流需要作为一个单独的微服务工程来提供给其他服务调用 xff0c 现在简单的写下工作流 xff08 使用的activiti xff09 微服务的搭建与简单使用 jdk
  • Error parsing lifecycle processing instructions pom.xml /xxxxx Maven Project Build Life

    本机是windows7 64bit xff0c eclipse版本信息 xff1a Eclipse Java EE IDE for Web Developers Version Neon 3 Release 4 6 3 Build id 2
  • freeRTOS 信号量:二值 计数 互斥 递归互斥

    用于信号量的队列 xff0c 都是只有队列数据结构的空间 xff0c 没有队列项存储空间的队列 二值 计数 互斥 递归互斥 xff0c 创建完成之后的内存状态 xff1a 转自 http blog csdn net zhzht1986101
  • Mapped Statements collection does not contain value for xxx

    说个同事出现的问题 xff1a Mapped Statements collection does not contain value for xxx 当时第一反应 xff0c 就是sql文件中没有定义id为 xxx xff0c 查看sql

随机推荐

  • CentOS mysql 安装

    1 因个人需要 安装了JDK https blog csdn net kkkder article details 78349419 2 下载https dev mysql com downloads mysql 5 7 html down
  • Spring AOP 日志记录

    package com config import java util Date AOP 添加访问日志 import org aspectj lang JoinPoint import org aspectj lang annotation
  • linux redis安装

    1 CentOS7 联网 2 进入redis官网 https redis io download 3 官网有详细教程 在执行make命令时 xff0c 报错 xff1a echo 34 34 gt make ldflags MAKE hir
  • 无人机巡线(1)

    本程序完成2020年电赛试题主要内容 如果用户认为已经掌握该文件使用方法 xff0c 请删除此文件 xff0c 然后添加FollowLine c文件 1 拿到了绿色的数据 xff1b 2 include 34 FollowLine h 34
  • 相机内参数和外参数

    求解相机内参 xff1a 相机标定 求解相机外参 xff1a 相机位姿估计 相机内参数是与相机自身特性相关的参数 xff0c 比如相机的焦距 像素大小等 xff1b 相机外参数是在世界坐标系中的参数 xff0c 比如相机的位置 旋转方向等
  • openrave安装

    需要用到某篇论文的代码 xff0c 需要用到openrave等第三方库 xff0c 折腾一番后记录一下 参考安装 https scaron info teaching installing openrave on ubuntu 14 04
  • IoT 技术演进:揭秘无源零功耗物联网通信技术原理和总体架构

    近日 xff0c OPPO发布了 零功耗通信 报告 xff0c 揭秘零功耗通信的概念 技术原理和总体架构 关键技术和挑战 xff0c 以及与6G关键技术的融合 自供电 黑科技 xff0c 零功耗通信 零功耗设备主要结合射频能量采集技术 反向
  • 解决修改httpd配置文件Options Indexes FollowSymLinks仍然无法禁止访问网站目录

    由于一些特殊需求或者安全考虑 xff0c 需要禁止用户访问网站目录 xff0c 所以需要改httpd conf配置文件 一般来说 xff0c 命令如下 xff1a vim etc httpd conf httpd conf 找到目录标签下的
  • 操作系统学习(十六) 、任务管理

    操作系统学习 xff08 十六 xff09 任务管理 一 任务 任务是处理器可以分配调度 执行和挂起的一个工作单元 它可用于执行程序 任务或进程 操作系统服务 中断或异常处理过程和内核代码 80x86提供了一种机制 xff0c 这种机制可以
  • 密码攻击——无分支的代码,执行时间是常量

    基于时间的密码攻击 考虑下边的代码 span class token keyword int span span class token function memcmp span span class token punctuation s
  • 从Simulink到PX4——Simulink-PX4插件安装与环境搭建

    从Simulink到PX4 Simulink PX4插件安装与环境搭建 前言0 准备工作1 安装WSL2 Setting up the PX4 Toolchain on Windows3 Setting up the PX4 Tool Ch
  • nuc980 linux 控制 gpio 引脚电平

    这里使用miscdevice设备的方式编写 xff0c 关键结构体与API define MISC DYNAMIC MINOR 255 struct miscdevice int minor const char name const st
  • CCM-SLAM跑自己的USB摄像头

    CCM SLAM跑自己的USB摄像头 ccm slam readme md如何使用自己的数据参数功能 尝试调用usb摄像头修改摄像头启动文件 96 usb cam test launch 96 测试摄像头修改 96 Client0 euro
  • ORB2单目读代码笔记12--单目初始化中基础矩阵推导计算、根据得分确定最佳单应矩阵和基础矩阵

    单目初始化中基础矩阵推导计算 根据得分确定最佳单应矩阵和基础矩阵 ComputeH21 结束 返回 FindHomographyFindHomography 跳转 CheckHomographyCheckHomography 结束 返回 F
  • Ubuntu 18.04 (Jetson Nano 4G/TX2)配置 CCM-SLAM

    文章目录 1 安装ROS2 安装OpenCV33 设置虚拟内存4 安装CCM SLAM 记录了安装CCM SLAM的详细过程以及踩过的坑 安装环境 xff1a Jetson Nano 4G Ubuntu 18 04 1 安装ROS 1 1更
  • Jetson Nano 调用CSI摄像头运行CCMSLAM

    文章目录 1 安装ROS的CSI摄像头软件包1 1 jetson csi cam1 2 jetson nano csi cam 2 修改Client0 euroc launch3 编写启动文件4 启动 1 安装ROS的CSI摄像头软件包 T
  • ROS多机通信SSH远程运行CCMSLAM

    文章目录 测试通信设置ROS MASTER URI主机rex终端输入 xff1a 从机nano终端输入 xff1a 启动CCMSLAM主机rex从机nano查看效果 SSH远程控制配置SSH启动SSH进行远程控制 背景 xff1a 主机 x
  • ORB2单目读代码笔记13--卡方检验原理及其在ORB-SLAM2中的用处

    卡方检验原理及其在ORB SLAM2中的用处 补 xff1a 卡方检验 补 xff1a 卡方检验 显著性水平 xff1a 显著性水平是估计总体参数落在某一区间内 xff0c 可能犯错误的概率 xff0c 用 表示 是指当原假设为正确时人们却
  • 玩转 Jetson Nano——开机准备与远程连接设置

    Nano开机准备与远程连接设置 1 开机前的准备1 1 认识 Nano1 2 硬件准备1 2 1 必备1 2 2 选配 1 3 在 SD 卡上烧写系统1 3 1 下载镜像1 3 2 格式化 SD 卡1 3 3 将镜像烧录到 SD 卡 1 4
  • CMAKE学习笔记

    文章目录 CMAKE常用指令CMake最低版本要求项目名称设置编译方式编译CXX的设置标志搜索外部库添加源文件子目录 查找源文件生成可执行文件生成链接库文件为可执行文件链接库指定头文件搜索路径SET定义变量LIST列表操作判断语句循环语句