cmake1:如何编写CMakeLists.txt

2023-05-16

  • 注:转载自:链接;该作者的cmake系列都很好,值得一看。

如何编写CMakeLists.txt文件

CMakeLists.txt 文件大小写不敏感
大型项目的根目录和子目录都会有这个文件

cmake_minimum_required( VERSION 2.8 )

这是声明要求的cmake编译器的最低版本
终端输入 cmake -version 可查看cmake的版本

project(slam)

这是声明cmake工程名字

project(slam VERSION 0.0.1)

还可以增加版本号

SET( CMAKE_CXX_COMPILER "g++")

设置使用g++编译器
这是添加变量的用法

set(KEY VALUE)

接收两个参数,用来声明变量。
在camke语法中使用${KEY}这种写法来取VALUE的值

set( CMAKE_CXX_FLAGS “-std=c++11 -march=native -O3” )

参数 “CMAKE_CXX_FLAGS”
含义是:set compiler for c++ language

“-std=c++11” 是添加c++11标准支持
这是 *.CPP 文件的编译选项

-march=native” 

指定目标程序用cpu架构来进行优化

“native”相当于自检测 cpu

“-march”是 gcc 优化选项

后面的“-O3”是用来调节编译时优化程度的
最高为 -O3,最低为 -O0 即不做优化
这个优化参数只有在参数

CMake -DCMAKE_BUILD_TYPE=release

时有效因为 debug 版的项目生成可执行文件需要有调试信息并且不需要进行优化而 release 版的不需要调试信息但需要优化

set(use_test ${SOURCES_DIRECTORY}/user_accounts.cpp) 
message("use_test :${use_test}")

message可以打印信息,类似于echo/printf,
主要用于查cmake文件的语法错误。

SET( CMAKE_BUILD_TYPE "Release" )

设置 cmake 编译模式有 debug 和 release 两种
PROJECT_SOURCE_DIR 是项目根目录也是CmakeLists.txt的绝对路径。

SET( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

设定生成的可执行二进制文件要存放的目录

SET( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

设定生成的库文件要存放的目录

SET(CMAKE_INSTALL_PREFIX install_path )

在 CMakeLists.txt 中指定安装位置

cmake -DCMAKE_INSTALL_PREFIX=/usr ..

在编译终端指定安装位置

LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib)

把该目录设为链接目录

INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)

设定头文件存放目录

ADD_SUBDIRECTORY(${PROJECT_SOURCE_DIR}/src)

增加子文件夹,也就是进入源代码文件夹继续构建

aux_source_directory(<dir> <variable>)

该命令会查找指定目录下的所有源文件将结果存进指定变量名

find_package( OpenCV REQUIRED )

添加依赖,去寻找该库的头文件位置、库文件位置以及库文件名称,
并将其设为变量,返回提供给 CMakeLists.txt 其他部分使用。
在 CMakeLists.txt 中使用第三方库的三部曲

  1. find_package
  2. include_directories
  3. target_link_libraries
include_directories(${OpenCV_INCLUDE_DIRS})

指定去哪里找头文件

target_link_libraries( ${OpenCV_LIBRARIES})

指定要链接的库文件

LINK_DIRECTORIES()

指定去哪里找库文件(.so/.lib/.ddl等)
“cmake_modules.cmake”文件是把 CMakeLists.txt 里用来寻找特定库的内容分离出来。
如果提示没有找到第三方依赖库可以尝试安装或者重新指定安装路径

安装的方法:

查找相关的软件包
apt-cache search 软件包名字

安装
sudo apt-get install 软件包名字

查找软件包头文件所在的路径
pkg-config --cflags 软件包名字

查找软件包库文件所在的路径
pkg-config --libs 软件包名字

手动指定安装路径:

find_package(Eigen3 REQUIRED)

set(Eigen3_DIR /usr/lib/cmake/eigen3/Eigen3Config.cmake)
set(EIGEN3_INCLUDE_DIRS /usr/local/include/eigen3)
include_directories(${EIGEN3_INCLUDE_DIRS})

假如找不到Eigen3库,我们就设置变量来指定Eigen3的头文件位置

如何生成静态库".a"文件
如何生成共享库".so"文件
如何利用共享库生成可执行程序

add_library(<name> [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL]source1 [source2 ...])

生成库的名字,直接写名字不加lib,会自动加上前缀。
SHARED动态库
STATIC静态库

SET(LIBHELLO_SRC hello.c) 
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) 
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})

一般我们使用的静态库/动态库只是后缀名不同而已,
上面是构建共享库 libhello.so 与静态库 libhello_static.a 的写法。

add_executable( useHello useHello.cpp )

生成一个可执行程序,add_executable( 程序名 源代码文件 )

target_link_libraries( useHello hello_shared )

将库文件链接到可执行程序上

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

cmake1:如何编写CMakeLists.txt 的相关文章

  • IEC104报文解读

    104规约大致有1997年和2002年 xff08 02版 xff09 两个版本 xff0c 在配置上没什么变化 xff0c 只是02版在97版上扩展了遥测 遥信等信息体起始地址 xff0c 区别如下 xff1a 类别 97 版 02 版
  • 单点要信双点遥信区别

  • log以2为底的对数

  • gdb几种设置断点的方式

    gdb几种设置断点的方式 方式1 根据函数名 xff0c 查找符号 xff08 symbol xff09 设置断电 此种方式最为简单 xff0c 阅读源代码 xff0c 了解函数如何调用 xff0c 在需要暂停运行的函数入口进行断点设置 但
  • Ubuntu常用命令

    一 创建新用户 1 创建用户testuser xff1a span class token variable sudo span adduser testuser 按照提示填写密码等信息 xff0c 可以一路回车默认 2 将用户添加到指定用
  • redis del与unlink命令用法及实现

    1 DEL 命令 DEL key key 删除指定的一批keys xff0c 如果删除中的某些key不存在 xff0c 则直接忽略 返回值 integer reply xff1a 被删除的keys的数量 例子 redis gt SET ke
  • ORA-01033错误解决方案

    今天在linux测试环境下登录sqlplus 不能正常登录报 xff1a ORA 01033错误 xff0c 捣鼓了半天 xff0c 参考网上的一些经验 xff0c 终于解决 xff0c 把心得总结一下 一 首先 xff1a 问题的产生原因
  • 四川麻将纯AI算法------最优拆牌

    ps 四川麻将AI算法已经开发完毕 xff0c 现已上线运营 xff0c 有需要交流的朋友请留言交流讨论 转载请说明出处 xff1a by wojiushi3344 我想现实生活中应该有很多朋友都在玩四川麻将 xff0c 不知道你有没有发现
  • Ubuntu 安装 HDF5 C++库

    HDF5 HDF5安装教程在源码包中的release docs文件夹中的INSTALL文件中有详细介绍 下载 根据系统选择下载源码包 xff0c 否则导致编译出错 xff1a https support hdfgroup org ftp H
  • C++和Windows平台的一些书籍

    从2010年学习编程以来 xff0c 到现在有差不多3年时间了 xff0c 过的真快啊 目前在深圳工作 xff0c 主要使用的是C 43 43 语言 xff0c 那么我就说说C 43 43 和Windows平台的书籍吧 1 C primer
  • Windows程序设计 截屏

    span style font family none span BLOWUP C Video Magnifier Program c Charles Petzold 1998 include lt windows h gt include
  • windows 程序设计 调色板

    调色板 这时就需要使用Windows调色盘管理器 xff08 在Windows 3 0中提出 xff09 了 Windows保留了256种颜色中的20种 xff0c 而允许应用程序修改其余的236种 xff08 在某些情况下 xff0c 应
  • windows程序设计 文字和字体

    文字和字体 简单的文字输出 让我们先来看看Windows为文字输出 影响文字的设备内容属性以及备用字体提供的各种函数 文字输出函数 我已经在许多范例程序中使用过最常用的文字输出函数 xff1a TextOut hdc xStart ySta
  • windows 网络编程 WinNet

    初始化 winNet 库 HINTERNET InternetOpen LPCTSTR lpszAgent DWORD dwAccessType LPCTSTR lpszProxyName LPCTSTR lpszProxyBypass D
  • Cocos 随写

    auto listenter 61 EventListenerTouchOneByOne create 设置单点触摸 listenter gt onTouchBegan 61 Touch pTouch Event event gt bool
  • android NDK崩溃信息调试

    android NDK崩溃 调试 主要利用 tombstones xff0c 可以看成是普通linux上利用core文件调试查问题类似 一 tombstones简介 1 什么是tombstone 当独立ndk bin方式或者jni方式开始运
  • 延迟加载DLL[转]

    问题来源 我的应用程序需要用到D3DX9 41 dll 程序里用的静态加载 xff0c 这个dll通常是把它放在根目录下 xff0c 否则应用程序找不到dll 但是有一天 xff0c 我需要把他放到别的目录 xff0c 那么下面就是一个解决
  • C++11 lambda 表达式

    lambda 表达式也是一种可调用对象 xff0c 那么可调用对象有哪些呢 xff1f 有函数 xff0c 函数指针 xff0c 重载了调用运算符的类 xff0c 还有lambda表达式 1个lambda表达式表示一个可调用的代码单元 xf
  • Windows核心编程之 2 字符和字符串

    1 包含新的安全是字符串处理头文件 StrSafe h counof 宏可以计算缓冲区的元素个数 StringCchCat StringCchCopy StringCchPrintf 34 Cch 34 表示 字符数 StringCbCat
  • Windows核心编程之 用户模式下的线程同步 读写锁和条件变量

    读写锁 include lt Windows h gt include lt tchar h gt include lt stdio h gt include lt process h gt include lt winbase h gt

随机推荐

  • 八戒常用之php时间戳strtotime前一天或后一天的日期

    date default timezone set 39 PRC 39 默认时区 今天 date 34 Y m d 34 time 昨天 date 34 Y m d 34 strtotime 34 1 day 34 明天 date 34 Y
  • 信号量和互斥锁的区别

    信号量和互斥锁 xff1a 信号量 xff08 semaphore sem f r xff09 用在多线程多任务同步的 xff0c 一个线程完成了某一个动作就通过信号量告诉别的线程 xff0c 别的线程再进行某些动作 而互斥锁 xff08
  • VLC生成流媒体实时流

    VLC生成实时流 xff0c 分为以下步骤 1 打开VLC xff0c 如果未下载可在官网下载 2 现在将要产生流的视频文件选中 3 开始产生流 4 检验流的生成 转载请注明出处 xff1a http www wolfnx com 2017
  • nmap 缺少module 'citrixxml'以及citrixxml.lua的修补

    当使用nmap的 script功能时 xff0c 可以参考nmap脚本使用总结 xff0c 但是在ubuntu12 04 LTS下使用默认下载安装的nmap xff08 版本为5 21 xff09 时 xff0c 当运行nmap scrip
  • 【ROS】Ubuntu18.04安装IntelRealsense D435

    参考文章 xff1a 文章一 文章二 这两篇文章多多少少和自己的有点不一样 xff0c 故在此记录 以实际为准 从官网https github com IntelRealSense librealsense下载安装包 xff08 用git的
  • 利用ROS同时采集激光雷达、摄像头数据并提取信息

    利用ROS同时采集激光雷达 摄像头数据并提取信息 在实际工程中 xff0c 往往需要采集lidar和camera的信息 xff0c 并进行同步 xff0c 而二者的频率往往不一致 xff0c 比如相机的采集频率为30HZ xff0c 而ve
  • C#连接SQLserver数据库

    导入命名空间 span class token keyword using span span class token namespace System span class token punctuation span Configura
  • MTK编译记录

    MTK编译记录 系统编译1 Q FAILED check kernel config 系统编译 1 Q FAILED check kernel config bin bash c python device mediatek build b
  • Git回退到指定版本

    Git版本回退 xff0c 在idea中不方便操作 xff0c 需进行强制提交 主要使用reset和push f进行强制回退 1 git 命令行回退到某个指定的版本 1 在开发过程中遇到合并别人的代码或者合并主分支的代码导致自己的分支代码冲
  • 四旋翼无人机crazepony烧写流程

    开源crazepony 自上而下 xff0c 从产品到底层的学习方法是效率比较高的 事前准备 xff1a 编译stm程序用的是Keil 5 xff0c 官方推荐用5不用4 4不支持Unicode8 xff0c 怕是不支持中文输入 在用官方包
  • deb 打包、安装、卸载

    deb 打包 安装 卸载 deb 格式是 Debian 系统 包含 Debian 和 Ubuntu 专属安装包格式 dpkg 是 Debian下的包管理工具 xff0c 用来执行软件包的打包 解包 安装 卸载等命令 运行环境 xff1a D
  • Kafka高可用 — KRaft集群搭建

    Apache Kafka Raft 是一种共识协议 xff0c 它的引入是为了消除 Kafka 对 ZooKeeper 的元数据管理的依赖 xff0c 被社区称之为 Kafka Raft metadata mode xff0c 简称 KRa
  • python线程池ThreadPoolExecutor的用法

    为了释放python GIL锁实现多个任务的并发运行 xff08 实际上并非真正的并行只是看起来并发 xff09 xff0c 往往采用多线程或者线程池的方式来实现 从Python3 2开始 xff0c concurrent futures模
  • 结构化数据、半结构化数据、非结构化数据的对比

    结构化数据 结构化数据是指可以使用关系型数据库表示和存储 xff0c 表现为二维形式的数据 一般特点是 xff1a 数据以行为单位 xff0c 一行数据表示一个实体的信息 xff0c 每一行数据的属性是相同的 举一个例子 xff1a idn
  • IoU(交并比)的理解及python实现

    1 概述 交并比 Intersection over Union IoU 是目标检测 语义分割 追踪等任务最常用的评估指标 交并比 xff0c 顾名思义是两区域交集与并集的比值 xff0c 当两区域完全重叠时交并比最大 xff0c 为1 x
  • 【复盘】2022年下半年软考·信息系统项目管理师

    题目简析 xff1a 上午选择题 xff1a 考得很分布 xff0c 十四五规划内容考了很多 xff0c 教材上的内容还是十三五 预估分45分 xff0c 一定能过 下午案例分析题 xff1a 三个题都不是十拿九稳的 xff08 特别是计算
  • pybind11 的 Hello World

    pybind11是一个轻量级的仅头文件库 xff0c 主要用于创建现有C 43 43 代码的Python绑定 Github地址 xff1a https github com pybind pybind11 官方文档 xff1a https
  • Flask 中使用 WebSocket 通信

    WebSocket 是一种计算机通信协议 xff0c 通过单个 TCP 连接提供全双工通信信道 WebSocket 使得客户端和服务器之间的数据交换变得更加简单 xff0c 允许服务端主动向客户端推送数据 在WebSocket API 中
  • git常用命令

    一 代码提交 提交代码 git pull 下拉代码并合并到本地 git add 提交修改 增加或者修改的文件 到本地缓存 git commit m 备注 提交修改备注到本地缓存 git push 将修改文件及备注一起提交到远程服务器 附1
  • cmake1:如何编写CMakeLists.txt

    注 xff1a 转载自 xff1a 链接 xff1b 该作者的cmake系列都很好 xff0c 值得一看 如何编写CMakeLists txt文件 CMakeLists txt 文件大小写不敏感 大型项目的根目录和子目录都会有这个文件 sp