学习cmake的使用和CMakeLists.txt

2023-05-16

1.学习cmake的使用和CMakeLists.txt

文章目录

  • 1.学习cmake的使用和CMakeLists.txt
    • 1.1 cmake外部构建基础
      • 1.2 让每个源文件目录都包含一个CMakeLists.txt
      • 1.3 安装
    • 1.4 构建静态库和动态库
      • 设置库的版本号
    • 1.5 安装共享库和头文件
    • 1.6 使用创建的库

1.1 cmake外部构建基础

基础目录结构

在这里插入图片描述

  • build 存放编译文件和输出文件
  • include 存放头文件
  • src 存放源文件
# CMakeLists.txt
# 2022/5/30
cmake_minimum_required(VERSION 3.0) # 确定最低版本
PROJECT (LEARN_CMAKE) #工程名
# 输出PROJECT_BINARY_DIR为编译目录/home/kt/Desktop/cpptest/build
MESSAGE(STATUS "This is BINARY dir " ${PROJECT_BINARY_DIR}) 
# 输出PROJECT_SOURCE_DIR为当前项目目录/home/kt/Desktop/cpptest
MESSAGE(STATUS "This is SOURCE dir " ${PROJECT_SOURCE_DIR}) 
set(CMAKE_CXX_STANDARD 11) #确定c++版本
SET(SRC_LIST src/main.cc src/test.cc) #确定编译的源文件
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/include") #指定头文件目录
ADD_EXECUTABLE(learn_cmake ${SRC_LIST}) #决定输出

编译方法:

cd build #进入build目录
cmake .. #生成Makefile文件
make	 #编译生成可执行文件
./learn_cmake #执行,必须要加./ ,或者也可以加入环境变量

1.2 让每个源文件目录都包含一个CMakeLists.txt

使用ADD_SUBDIRECTORY添加子目录
在这里插入图片描述

其中外部CMakeLists.txt文件内容为

# CMakeLists.txt
# 2022/5/30
cmake_minimum_required(VERSION 3.0) # 确定最低版本
PROJECT (LEARN_CMAKE) #工程名
# 输出PROJECT_BINARY_DIR为编译目录/home/kt/Desktop/cpptest/build
MESSAGE(STATUS "This is BINARY dir " ${PROJECT_BINARY_DIR})
# 输出PROJECT_SOURCE_DIR为当前项目目录/home/kt/Desktop/cpptest
MESSAGE(STATUS "This is SOURCE dir " ${PROJECT_SOURCE_DIR})
set(CMAKE_CXX_STANDARD 11) #确定c++版本
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/include") #指定头文件目录
ADD_SUBDIRECTORY(src bin)

src目录下CMakeLists.txt文件内容为

SET(SRC_LIST main.cc test.cc) #确定编译的源文件
ADD_EXECUTABLE(learn_cmake ${SRC_LIST}) #决定输出

其中ADD_SUBDIRECTORY(src bin)中的bin指定了编译的输出文件夹,也就是build目录下会生成一个bin目录,目标文件就生成在那里

1.3 安装

使用make install命令将内容安装到/usr/bin目录中
添加一些版权COPYRIGHT README runhello.sh doc/* 等内容
语法:INSTALL(关键字决定内容 内容 目的 路径)
其中路径如果使用相对路径会默认调用cmake的变量CMAKE_INSTALL_PREFIX –> usr/local
示例:其中全部使用相对路径

# 在最外层的CMakeLists.txt处添加以下内容

# 安装文件 使用FILES
INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake)

# 非目标文件的可执行程序安装 使用PROGRAMS
INSTALL(PROGRAMS runhello.sh DESTINATION bin)

# 安装目录 使用DIRECTORY 注意"doc/"表示安装目录下的内容,不加"/"表示安装目录
INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)

cmake后执行make install命令(可能需要sudo 才能写入相应位置)
可以得到如下,成功安装

1.4 构建静态库和动态库

静态库扩展名一般为"a"或者"lib",动态库扩展名一般为"so"或者"dll"
语法:ADD_LIBRARY(输出名 SHARED/STATIC 内容)

  • SHARED 共享库 / STATIC 静态库
  • 库输出的库名字是libname.xxx,会在原名字name加上前缀lib再加上文件扩展名
# src目录下的CMakeLists.txt处添加以下内容

# 确定编译的源文件
SET(SRC_LIST main.cc test.cc) 
# 生成共享库(动态库)
ADD_LIBRARY(hello SHARED ${SRC_LIST})
# 生成静态库
ADD_LIBRARY(hello STATIC ${SRC_LIST})

注意如果像上面那么写会报错如下信息,原因是重名了。
在这里插入图片描述
**解决方法:**使用SET_TARGET_PROPERTIES 语法

# src目录下的CMakeLists.txt处添加以下内容

# 确定编译的源文件
SET(SRC_LIST main.cc test.cc) 

# 生成共享库(动态库)
ADD_LIBRARY(hello_shared SHARED ${SRC_LIST})
# 重命名为hello
SET_TARGET_PROPERTIES(hello_shared PROPERTIES OUTPUT_NAME "hello")
# 清除内容
SET_TARGET_PROPERTIES(hello_shared PROPERTIES CLEAN_DIRECTORY_OUTPUT 1)

# 生成静态库
ADD_LIBRARY(hello STATIC ${SRC_LIST})
SET_TARGET_PROPERTIES(hello PROPERTIES OUTPUT_NAME "hello")
SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECTORY_OUTPUT 1)

make后生成了相应的动态库和静态库
在这里插入图片描述

设置库的版本号

语法例如:SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)

VERSION 指代动态库版本,SOVERSION 指代 API 版本

1.5 安装共享库和头文件

# 安装头文件和动态库和静态库
INSTALL(FILES ../include/test.h DESTINATION include/test)
INSTALL(TARGETS hello_shared hello LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
  • TARGETS 后面指要安装的内容
  • LIBRARY 动态库
  • ARCHIVE 静态库
 # 执行cmake
 cmake -D CMAKE_INSTALL_PREFIX=usr/ ..

指定默认相对路径变量 CMAKE_INSTALL_PREFIXusr/

再执行make / make install 可以看到安装结果,(显示up-to-date是因为我之前已经安装过一次了)
在这里插入图片描述

1.6 使用创建的库

在1.5已经将相应的库和头文件安装好了,使用只需要在新工程中加入对应的库和头文件

# 加入头文件目录
INCLUDE_DIRECTORIES("/usr/include/test") 

# 引入库
TARGET_LINK_LIBRARIES(learn_cmake libhello.so)

注意TARGET_LINK_LIBRARIES需要加在ADD_EXECUTABLE后面,否则会报错

就可以正常编译运行了。还可以用ldd learn_cmake来查看链接情况

在这里插入图片描述

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

学习cmake的使用和CMakeLists.txt 的相关文章

  • 如何检测当前作用域在 CMake 中是否有父作用域?

    有什么方法可以检测当前作用域是否有父作用域 我有一个项目 可以是独立项目 也可以是另一个项目的子项目 为了允许子项目情况 我使用 PARENT SCOPE 标志来 set 将内容推送到父项目 但是 当构建为独立项目时 我收到 当前范围没有父
  • cmake中如何连接字符串

    有没有办法在cmake中连接字符串 我有一个仅包含具有主要方法的 cpp 文件的文件夹 我认为只需在所有 src 文件中使用 foreach 就很容易了 这就是我到目前为止所得到的 project opengl tutorial cmake
  • 使用cmake创建UWP包

    我正在开发简单的 hello world 应用程序 main cpp include
  • 即使 CMake 中的 WITH_CUDA=ON,OpenCV 也不会使用 CUDA 进行构建

    我尝试使用 CMake GUI 版本 构建 OpenCV 3 1 以启用 Cuda 我已经安装了 Cuda 7 5 64 位版本 CMake 自动找到了 Cuda 工具包的正确路径 我确保WITH CUDA值设置为ON 并按下配置 这是我对
  • 如何使用Cmake使用框架?

    对于 Macos 我想链接到一些框架 在 Windows 中 我想链接到一些库 比如OpenGL Framework 如何使用cmake表达这个需求 您可以尝试以下代码 target link libraries
  • VS 2015 命令提示符中不再找到 rc.exe

    我刚刚安装了 Windows 10 创意者更新 版本 10 0 15063 我安装了多个版本的 Visual Studio 2012 2013 2015 和 2017 我几周前才安装了 VS 2017 Problem CMake 版本 3
  • CMake:如何在多个文件上运行自定义命令来生成源文件?

    我有以下情况 我想编译一些Scheme文件Gambit https github com gambit gambit成可执行文件 为此 我使用 gambit 将所有计划文件翻译 生成为 C 和目标文件 然后将其编译并链接为可执行文件 假设我
  • 如何重新安装最新的cmake版本?

    我想在Linux环境下安装cmake的最新版本 我安装了 cmake 3 5 版 但某些应用程序不支持 我尝试通过卸载当前版本来升级它 但是当我使用 sudo apt get install cmake 重新安装时 我重新安装了相同的版本
  • M1 MacBook Pro 和 cmake 的编译错误

    我刚刚拿到了新的 M1 MacBook Pro 正在尝试编译大学工作所需的代码库 以下是我已采取的步骤 我使用 Rosetta 将终端设置为始终打开 安装的自制程序using bin bash c curl fsSL https raw g
  • 如何从 CMake 运行 .bat 文件?

    如何在预链接或构建后事件中从 CMake 运行 bat 文件 你可以使用add custom command e g if WIN32 add custom command TARGET
  • Jenkins + Cmake + JIRA = 多个相互依赖项目的 CI?

    我们的系统中有许多小项目在 Linux 上运行 Slackware 7 11 正在慢慢迁移到 RHEL 6 0 大约 50 100 个应用程序和 15 20 个库 我们几乎所有的应用程序都使用我们的一个或多个库 我们的源树看起来像这样 ap
  • fbtorch:cmake 找不到 torch 目录

    我正在尝试构建并安装 fbtorch 但是当我使用 cmake 时出现以下错误 CMake Error at CMakeLists txt 9 FIND PACKAGE By not providing FindTorch cmake in
  • 在cmake中检测项目语言

    我想检测当前的项目语言 例如 如果我有这样的东西 cmake minimum required VERSION 3 0 project foo VERSION 1 0 LANGUAGES CXX 我需要这样的东西 if project la
  • 如何以编程方式迭代所有 CMake 目标?

    有没有办法从顶层获取 CMake 项目的所有目标CMakeLists txt 即以编程方式迭代目标 我想要这样做的原因是将一些 XCode 特定设置应用于每个目标 if CMAKE GENERATOR MATCHES Xcode inclu
  • 为什么 CMake 没有检测到对我生成的文件的依赖关系?

    我正在尝试使用自定义命令生成标头 每次重建时都应更新标头 以便包含它的源文件也将被重建 实际命令是一个脚本 但这里是一个简化版本 这是我的项目 CMakeLists txt cmake minimum required VERSION 2
  • CMake:将为 lib 构建的对象文件重用到另一个 lib 目标中

    我正在尝试将我的项目转移到CMake 同时对编译过程进行一些优化 这是交易 我有几个子目录 必须 每个子目录都编译成静态库 这有效 我想将每个子目录中的所有目标文件收集到另一个更大的 完整的静态库中 它看起来像这样 libBig a mad
  • 如何在 Windows 中使用 cmake 更轻松地链接 gtk 库?

    我现在通过手动包含所有必需的路径 gtk包位于D Tools gtk bundle 2 20 0 20100406 win32 include directories D Tools gtk bundle 2 20 0 20100406 w
  • 如何将脚本的依赖项添加到 CMake 中的目标?

    链接我的程序后 我需要对其执行一些后处理 我添加了一个add custom command TARGET 效果很好 但是 这个额外的自定义命令运行一个脚本 未生成 它已签入代码库 并且我希望如果该脚本发生更改 目标将被视为过时 以便正确重建
  • cmake 找不到 boost 库,因为它查找错误的文件名

    我根据文档在 Windows 8 1 机器上构建了 boost 1 56 库 作为共享库和静态库 他们全部出现在BOOST ROOT stage lib目录 文件名格式如下 boost thread vc120 mt 1 56 dll bo
  • 如何让 CMake 为目标安装 PDB 文件

    如何让 CMake 安装调试 Visual Studio 生成的 DLL 文件和 EXE 文件所需的配套 PDB 文件 我已经挣扎了一段时间 试图找到这个问题的一个好的答案 我现在认为我找到了一个 使用安装文件命令

随机推荐

  • PCL---RANSAC随机采样一致性算法

    前言 通过前面的文章 xff0c 我们基本上代建的相关环境 本文将继续基于此继续学习PCL相关采样一致性算法 基础代码下载 1 准备 1 1 Ransac算法介绍 RANSAC从样本中随机抽选出一个样本子集 xff0c 使用最小方差估计算法
  • PCL-使用potree可视化

    前言 在几篇文章中 xff0c 基本实现了对PCL相关操作 xff0c 最近在github上找到了Web端对点云数据可视化兼容很好的项目 Potree 对此本文将介绍如何使用Potree来进行web端的可视化 1 Potree 官方运行 P
  • PCL- Las文件处理

    前言 在对点云数据处理的时候 xff0c 很多时候激光雷达扫描的文件不一定是 pcd文件 xff0c 这个时候需要进行相关文件处理 xff0c 如Las xff0c laz e57等文件格式 xff0c 本文将介绍las文件的读写 1 引入
  • PCL-Window下安装

    1 安装编译工具链MSVC MSVC工具链是visual studio 自带的工具链 xff0c 因此安装visual studio社区版即安装完成相应的MSVC工具链 2 安装Clion 相比与Visual studio的界面来说 xff
  • STM32 串口详细讲解

    什么是串口 UART Universal Asynchronous Receiver Transmitter 通用异步收发器 USART Universal Synchronous Asynchronous Receiver Transmi
  • ubuntu 修改pip指定路径

    参考这篇文章 还有 这篇文章 第二篇更好一点 xff0c 亲测成功
  • CrowdHuman数据集介绍

    CrowdHuman数据集是旷世发布的用于行人检测的数据集 xff0c 图片数据大多来自于google搜索 CrowdHuman 数据集数据量比较大 xff0c 训练集15000张 xff0c 测试集5000张 xff0c 验证集4370张
  • CityPersons数据集介绍

    CityPersons数据集是cityscape的一个子集 xff0c 它只包含个人注释 有2975张图片用于培训 xff0c 500张和1575张图片用于验证和测试 一幅图像中行人的平均数量为7人 xff0c 提供了可视区域和全身标注 C
  • CUHK-SYSU数据集介绍

    该数据集是一个大规模的人员搜索基准 xff0c 包含18184张图像和8432个身份 根据图像来源 xff0c 数据集可以分为两部分 xff1a 街道捕捉和电影 xff1a 在街拍中 xff0c 图像通过手持摄像机收集 xff0c 跨越数百
  • ETHZ数据集介绍

    Ess等构建了基于双目视觉的行人数据库用于多人的行人检测与跟踪研究 该数据库采用一对车载的AVT Marlins F033C摄像头进行拍摄 xff0c 分辨率为640 480 xff0c 帧率13 14fps xff0c 给出标定信息和行人
  • Swin Transformer V2

    Swin Transformer V2 论文链接 xff1a https arxiv org pdf 2111 09833 pdf 代码链接 xff1a https github com microsoft Swin Transformer
  • Jetson_Xavier_NX使用教程1(刷机)

    刷机教程 一 xff1a 准备 1 xff1a 准备需要一个tf卡 xff0c 容量最好大点 xff0c 我买的128G的 2 xff1a 还有两个软件一个是格式化卡的软件 xff0c 一个是将镜像文件写入的卡的软件 格式化卡的软件 写入镜
  • Jetson_Xavier_NX使用教程2(简单实用)

    本文会介绍一些刷机后的基本操作 1 风扇控制 刚开始插入电源风扇不转我以外坏了 xff0c 后来才发现并没有 Xavier NX的风扇在系统内核中有一套自动控制温度和转速的算法 xff0c 经过我观察大约在40度左右的时候会自动开启风扇进行
  • NVIDIA Jetson NX使用教程3配置pytorch环境

    本节主要记录 xff0c 安装pytorch及torch vision 1 下载Pytorch 因为jetson属于arm架构的机器 xff0c 所以需要去nvidia的官网下载对应的安装包而不是pytroch的官网 官网链接 xff0c
  • Java 基于 IETF RFC 2617 身份认证

    IETF RFC 2617 身份认证 是基于 HTTP 协议进行验证的 xff0c 认证过程中需要发送两次 HTTP 请求 xff0c 第一次请求服务器返回 401 和 认证标识 xff08 nonce xff09 xff0c 第二次访问H
  • 判断一台机器是大端序还是小端序

    在几乎所有的机器上 xff0c 多字节对象都被存储为连续的字节序列 例如在C语言中 xff0c 一个类型为int的变量x地址为0x100 xff0c 那么其对应地址表达式 amp x的值为0x100 且x的四个字节将被存储在存储器的0x10
  • STL容器保存智能指针并将this指针通过emplace传入STL容器所造成的致命问题(【double free or corruption (out)】和【bad_weak_ptr】)

    我用std queue保存了一个Message类型的智能指针 queue lt shared ptr lt MessageA gt xff0c 然后在Message类型中来将this指针插入队列 xff0c 使用std queue push
  • 实时动态定位(RTK)

    内容来着网络 实时动态定位 xff1a Real Time Kinematic RTK技术的关键在于使用了GPS的载波相位观测量 xff0c 并利用了参考站和移动站之间观测误差的空间相关性 xff0c 通过差分的方式除去移动站观测数据中的大
  • 几个实用的 Bat 脚本命令

    文章目录 1 截图2 息屏后锁屏3 查看当前的路径4 倒计时5 密码输入6 比较两个文本的差异 1 截图 start snippingtool 2 息屏后锁屏 powershell Add Type 39 DllImport 34 user
  • 学习cmake的使用和CMakeLists.txt

    1 学习cmake的使用和CMakeLists txt 文章目录 1 学习cmake的使用和CMakeLists txt1 1 cmake外部构建基础1 2 让每个源文件目录都包含一个CMakeLists txt1 3 安装 1 4 构建静