c++程序的打包编译cmake+make

c++打包编译

  • 1 在不用系统中打包介绍
    • 1.1 linux中打包c++程序的2种方式
    • 1.2 windows中打包c++程序
    • 1.3 cmake+Ninja和cmake+make的两种方式对比
      • 1.3.1 Ninja是什么(可以认为是make工具的一个替代产品)
      • 1.3.2 cmake+Ninja可以用于linux和windows系统中,编译效率比cmake+make更高
      • 1.3.3 cmake+make可以用于linux系统中,不要在windows系统中用
    • 1.4 cmake+make的编译方式只可以用于linux系统中,不能用于windows系统中,为什么还说可以跨平台使用呢?
    • 1.5 安装g++、cmake、make软件
  • 2 linux中第1种g++命令(直接但是复杂,不常用)
  • 3 linux中第2种打包方式cmake命令+make命令(难但是方便,常用)
    • 3.1 编译的流程
      • 3.1.1 第1步:准备好项目代码
      • 3.1.2 第2步:编写CMakeLists.txt文件
      • 3.1.3 第3步:创建指定文件夹并用cmake生成构建系统
      • 3.1.4 第4步:编译项目
      • 3.1.5 第5步:运行程序
    • 3.2 几个疑问点解释
      • 3.2.1 为什么要创建build文件夹
      • 3.2.2 cmake命令为什么是cmake ..
      • 3.2.3 cmake ..为什么能够找到上级目录的CMakeLists.txt文件?并没有指定CMakeLists.txt文件呀?
      • 3.2.4 cmake具体干了什么?
    • 3.3 cmake和make的区别
    • 3.4 第2种cmake+make打包方法为什么能够实现跨平台?实现跨平台是cmake的功劳还是make的功劳?
    • 3.5 只有在linux中编译c++代码才能使用第2种cmake+make打包方法,在windows中 使用CMake + 构建工具(如 Make/Ninja/MSBuild) 的组合
  • 4 cmake的1个案例和相关语法
  • 5 make的相关语法进一步介绍

这篇博客是在上一篇博客的基础上增加了cmake的相关知识,更多打包和第3方库的情况,可以看下面这篇博客。

c++下程序的运行(第3方库的安装及安装gdal)_c++安装库-CSDN博客

1 在不用系统中打包介绍

1.1 linux中打包c++程序的2种方式

linux中工作中打包时,下面的第1种方式g++和第2种方式cmake+make都推荐,更倾向于第2种方式。

c++的2种打包方式

  • 方式一:使用g++编译器命令:
    第1种方式是使用g++命令,通过g++命令进行打包,但是可能需要一长串打包命令。但是对于简单的项目,打包命令就比较简单一些。

  • 方式二:使用cmake和make命令打包:
    编写CMakeLists.txt文件,通过cmake命令生成对应平台的makefile文件或.sln文件。最后使用make命令生成可执行程序或者第三方库。

  • 2种方式的对比:
    g++:
    适合小项目;

第2种方式:
自动处理路径分隔符、库依赖等平台差异。
支持生成多种构建系统(如 Makefile、Ninja、Xcode 项目等)。

1.2 windows中打包c++程序

c++常见的4种打包方式,另外还有好多种,不同的软件可以都会有自己的编译方式。

windows中打包文件,工作中只推荐2种方式:
第1种是使用集成开发环境自带的,比如vs就用vs的打包方式,clion就用clion打包方式。
第2种是用MinGW-win64软件的g++命令方式打包。

  • 方式一:Visual Studio 的MSVC编译的方式
    在这里插入图片描述

  • 方式二:使用cmake和其它构建工具命令打包:
    编写CMakeLists.txt文件,通过cmake命令生成对应平台的的makefile文件或.sln文件。最后使用MinGW、Ninja等命令生成可执行程序或者第三方库。
    在这里插入图片描述

  • 方式三:使用g++编译器命令:
    第1种方式是使用g++命令,通过g++命令进行打包,但是可能需要一长串打包命令。但是对于简单的项目,打包命令就比较简单一些。

在这里插入图片描述

  • 方式四:clion软件的编译方式
    在这里插入图片描述

1.3 cmake+Ninja和cmake+make的两种方式对比

1.3.1 Ninja是什么(可以认为是make工具的一个替代产品)

在这里插入图片描述

1.3.2 cmake+Ninja可以用于linux和windows系统中,编译效率比cmake+make更高

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.3.3 cmake+make可以用于linux系统中,不要在windows系统中用

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.4 cmake+make的编译方式只可以用于linux系统中,不能用于windows系统中,为什么还说可以跨平台使用呢?

cmake+make的编译方式只可以用于linux系统中,不能用于windows系统中。
说的跨平台这个概念方式,实际上专门指的是cmake这种方式,在windows中和linux中写1个CMakeLists.txt文件,然后就可以使用cmake工具在linux或windows中创建配置中间文件了,这里实现了跨平台。第2步编译的时候make只能用于linux中,是不能跨平台的。

1.5 安装g++、cmake、make软件

g++、cmake、make都是软件,如果要使用,必须先在电脑上进行安装好。然后添加到环境变量中

sudo yum install gcc gcc-c++
sudo yum install cmake
sudo yum install make

2 linux中第1种g++命令(直接但是复杂,不常用)


1 g++ -o executable_name source_file.cpp  // 编译普通文件
2 g++ -o your_program your_program.cpp -lgdal  // 编译带gdal包的文件,默认从环境变量找头文件和库文件。
3 g++ -o your_program your_program.cpp -I/path/to/gdal/include -L/path/to/gdal/lib -lgdal  // -I选项用于指定头文件路径,不涉及库文件,-L选项用于指定库文件所在的目录,-l选项用于指定库文件名。-lgdal指令会去找libgdal.a或者libgdal.so,-L和-l不管是动态库还是静态库都一样。-l选项后面跟的是库文件的名称,不需要包含文件扩展名。
4 g++ -o your_program your_program.cpp -I/path/to/gdal/include -Wl,-rpath,/path/to/gdal/lib -L/path/to/gdal/lib -lgdal  // 防止运行时找不到动态库文件,编译程序时使用-Wl,-rpath选项来指定运行时库文件的搜索路径。

在这里插入图片描述

1、编译时指定运行时的库文件,有时候在打包时,动态库本身依赖于其它动态库,这时候出现找不到的情况,可以使用-Wl,-rpath指定,可以指定多个路径,用冒号分隔:
g++ -o myapp src/main.cpp -L./lib -lmylib -Wl,-rpath=/path1:/path22、运行c++程序时,找不到动态库,可以使用export加进来,这样运行的时候就能找到第3方库了
export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH
./myapp

3 linux中第2种打包方式cmake命令+make命令(难但是方便,常用)

3.1 编译的流程

(1)准备好项目代码;
(2)编写CMakeLists.txt文件;
(3)创建指定文件夹并用cmake生成构建系统;
(4)make命令进行编译
(5)运行程序

3.1.1 第1步:准备好项目代码

在这里插入图片描述

3.1.2 第2步:编写CMakeLists.txt文件

在这里插入图片描述

3.1.3 第3步:创建指定文件夹并用cmake生成构建系统

创建单独的构建目录(推荐)进去再使用cmake,不要在根目录里使用cmake,这里约定俗成就是build目录,因为cmake会生成很多文件,如果之后重新编译等可以先把这个目录直接删除,而不用每个文件1个个删除。

# 进入项目目录
cd my_project# 创建构建目录(推荐使用out-of-source构建)
mkdir build
cd build# 生成构建系统(根据你的系统选择生成器)
# 在Linux/macOS上:
cmake ..# 在Windows上(如果使用Visual Studio):
# cmake .. -G "Visual Studio 16 2019"

3.1.4 第4步:编译项目

# 编译项目
# 或者在Linux/macOS上也可以直接使用make(如果cmake生成的是Makefile)
make# 也可以用这个命令
cmake --build .

3.1.5 第5步:运行程序

在这里插入图片描述

3.2 几个疑问点解释

3.2.1 为什么要创建build文件夹

在这里插入图片描述

3.2.2 cmake命令为什么是cmake …

在这里插入图片描述

3.2.3 cmake …为什么能够找到上级目录的CMakeLists.txt文件?并没有指定CMakeLists.txt文件呀?

CMake 默认会在指定目录中查找名为 CMakeLists.txt 的文件,这是 CMake 的内置约定,所有 CMake 项目都遵循这一规则。
在这里插入图片描述
在这里插入图片描述

3.2.4 cmake具体干了什么?

在这里插入图片描述

3.3 cmake和make的区别

  • cmake … 只做配置,是一个生成配置的软件。
    它解析 CMakeLists.txt,检查环境,生成构建系统文件(如 Makefile),但不会调用编译器。
  • make 或 cmake --build . 才是编译
    它们根据生成的构建系统文件,实际调用 g++/clang/msvc 等编译器生成二进制文件。
  • cmake … 不会直接生成可执行文件,它只是准备构建环境。必须再执行 make 或 cmake --build . 才会真正编译代码。使用2步而不是1步主要是因为CMake 的分离配置和编译的设计哲学。
  • cmake这种设计提高了跨平台灵活性,也是现代构建系统的通用模式。它会根据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4 第2种cmake+make打包方法为什么能够实现跨平台?实现跨平台是cmake的功劳还是make的功劳?

  • CMake 是跨平台灵活性的核心实现者,它通过抽象平台差异,生成适合当前环境的构建系统。

  • Make 是平台相关的执行工具,其本身不具备跨平台能力,依赖 CMake 为它生成平台适配的 Makefile。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.5 只有在linux中编译c++代码才能使用第2种cmake+make打包方法,在windows中 使用CMake + 构建工具(如 Make/Ninja/MSBuild) 的组合

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4 cmake的1个案例和相关语法

# 设置CMake最低版本要求
cmake_minimum_required(VERSION 3.10)# 定义项目名称和使用的语言(CXX表示C++)
project(MyProject LANGUAGES CXX)# 设置C++标准为C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)# 查找OpenCV库(需要提前安装)
find_package(OpenCV REQUIRED)# 设置头文件搜索路径,使用空格或者换行分割多个路径
include_directories(${OpenCV_INCLUDE_DIRS}  # OpenCV头文件路径include                 # 项目主include目录include/utils          # 项目子目录中的头文件include/core           # 项目子目录中的头文件third_party/include    # 第三方库头文件
)# 设置动态库搜索路径,使用空格或者换行分割多个路径
link_directories(lib                    # 项目主库目录lib/x64               # 项目子目录中的库third_party/lib       # 第三方库目录${OpenCV_LIBRARY_DIRS} # OpenCV库路径
)# 收集所有源文件,递归查找
file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*.cc")# 添加可执行文件
add_executable(${PROJECT_NAME} ${SOURCES})# 链接库文件,使用空格或者换行分割多个库
target_link_libraries(${PROJECT_NAME}${OpenCV_LIBS}        # OpenCV库utils                 # 项目内部库core                  # 项目内部库pthread               # 系统线程库dl                    # 动态加载库
)

1、使用cmake进行打包,包含可执行程序和动态依赖库_cmake 打包-CSDN博客

2、CMake 基本常用语法 CMakeLists.txt_cmakelist语法下载-CSDN博客

3 CMake常用命令_cmake命令-CSDN博客

5 make的相关语法进一步介绍

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark on K8s 在 vivo 大数据平台的混部实战与优化

一、Spark on K8s 简介 (一)定义与架构 Spark on K8s 是一种将 Spark 运行在 Kubernetes(K8s)集群上的架构,由 K8s 直接创建 Driver 和 Executor 的 Pod 来运行 Spark 作业。其架构如下。 Driver Pod:相当于 Spark 集群中的 Driver,负责作业的调度和管理,它会根据作业…

MDA测量数据查看器【内含工具和源码地址】

一、工具介绍 MDA测量数据查看器用于显示和分析以MDF格式提供的测量数据。 支持MDF3.3之前含MDF3.3的二进制格式,支持Vector CANape and ETAS Inca. Kvaser CAN Logger (MDF 3.2) 文件。 MDF (Measurement Data Format)是一种二进制文件,用来记录、交换…

番外篇 | SEAM-YOLO:引入SEAM系列注意力机制,提升遮挡小目标的检测性能

前言:Hello大家好,我是小哥谈。SEAM(Squeeze-and-Excitation Attention Module)系列注意力机制是一种高效的特征增强方法,特别适合处理遮挡和小目标检测问题。该机制通过建模通道间关系来自适应地重新校准通道特征响应。在遮挡小目标检测中的应用优势包括:1)通道注意力增强…

使用VHDL语言实现TXT文件的读写操作

使用FPGA进行图像处理时,通常需要将TXT文件中的图像数据读出到TestBench中,并将仿真的结果写入到TXT文件中,用于确认图像处理的结果是否正确。 VHDL中TXT文件的读写操作如下所示, --------------------------------------------…

基于Redis的4种延时队列实现方式

延时队列是一种特殊的消息队列,它允许消息在指定的时间后被消费。在微服务架构、电商系统和任务调度场景中,延时队列扮演着关键角色。例如,订单超时自动取消、定时提醒、延时支付等都依赖延时队列实现。 Redis作为高性能的内存数据库&#x…

GN ninja 工程化构建例程

文章目录 1. 前言✨2. 工程实例🚩2.1 工程目录结构2.2 工程顶层.gn文件2.3 工具链配置.gn文件2.4 编译配置.gn文件2.5 编译目标配置.gn文件2.6 工程接口文件2.7 动态库编译.gn文件2.8 动态库源文件2.9 静态库编译.gn文件2.10 静态库源文件2.11 主程序编译.gn文件2.12 主程序源…

基于亚博K210开发板——内存卡读写文件

开发板 亚博K210开发板 实验目的 本实验主要学习 K210 通过 SPI 读写内存卡文件的功能 实验准备 实验元件 开发板自带的 TF 卡、LCD 显示屏 (提前准备好 FAT32 格式的TF 卡。TF 插入 TF 卡槽的时候注意方向,TF 卡的金手指那一面需要面向开发板&am…

51单片机实验五:A/D和D/A转换

一、实验环境与实验器材 环境:Keli,STC-ISP烧写软件,Proteus. 器材:TX-1C单片机(STC89C52RC)、电脑。 二、 实验内容及实验步骤 1.A/D转换 概念:模数转换是将连续的模拟信号转换为离散的数字信…

C++ 常用的智能指针

C 智能指针 一、智能指针类型概览 C 标准库提供以下智能指针&#xff08;需包含头文件 <memory>&#xff09;&#xff1a; unique_ptr&#xff1a;独占所有权&#xff0c;不可复制&#xff0c; 可移动shared_ptr&#xff1a;共享所有权&#xff0c;用于引用计数weak_pt…

6.8.最小生成树

一.复习&#xff1a; 1.生成树&#xff1a; 对于一个连通的无向图&#xff0c;假设图中有n个顶点&#xff0c;如果能找到一个符合以下要求的子图&#xff1a; 子图中包含图中所有的顶点&#xff0c;同时各个顶点保持连通&#xff0c; 而且子图的边的数量只有n-1条&#xff0…

Spring Boot 集成金蝶 API 演示

✨ Spring Boot 集成金蝶 API 演示&#xff1a;登录 / 注销 Cookie 保存 本文将通过 Spring Boot 完整实现一套金蝶接口集成模型&#xff0c;包括&#xff1a; ✅ 普通登录✅ AppSecret 登录✅ 注销✅ Cookie 保存与复用 &#x1f4c5; 项目结构 src/ ├── controller/ │…

React 受控表单绑定基础

React 中最常见的几个需求是&#xff1a; 渲染一组列表绑定点击事件表单数据与组件状态之间的绑定 受控表单绑定是理解表单交互的关键之一。 &#x1f4cd;什么是受控组件&#xff1f; 在 React 中&#xff0c;所谓“受控组件”&#xff0c;指的是表单元素&#xff08;如 &l…

基于FPGA的AES加解密系统verilog实现,包含testbench和开发板硬件测试

目录 1.课题概述 2.系统测试效果 3.核心程序与模型 4.系统原理简介 4.1 字节替换&#xff08;SubBytes&#xff09; 4.2 行移位&#xff08;ShiftRows&#xff09; 4.3 列混合&#xff08;MixColumns&#xff09; 4.4 轮密钥加&#xff08;AddRoundKey&#xff09; 4.…

6.5 GitHub监控系统实战:双通道采集+动态调度打造高效运维体系

GitHub Sentinel Agent 定期更新功能设计与实现 关键词:GitHub API 集成、定时任务调度、Python 爬虫开发、SMTP 邮件通知、系统稳定性保障 1. GitHub 项目数据获取功能 1.1 双通道数据采集架构设计 #mermaid-svg-ZHJIMXcMAyDHVhmV {font-family:"trebuchet ms",v…

Explorer++:轻量级高效文件管理器!!

项目简介 Explorer 是一款专为Windows操作系统设计的轻量级且高效的文件管理器。作为Windows资源管理器的强大替代方案&#xff0c;它提供了丰富的特性和优化的用户体验&#xff0c;使得文件管理和组织变得更加便捷高效。无论是专业用户还是普通用户&#xff0c;都能从中受益&a…

7、生命周期:魔法的呼吸节奏——React 19 新版钩子

一、魔法呼吸的本质 "每个组件都是活体魔法生物&#xff0c;呼吸节奏贯穿其生命始终&#xff0c;"邓布利多的冥想盆中浮现三维相位图&#xff0c;"React 19的呼吸式钩子&#xff0c;让组件能量流转如尼可勒梅的炼金术&#xff01;" ——以霍格沃茨魔法生理…

理解计算篇--正则表达式转NFA--理论部分

空正则表达式转NFA单字符正则表达式转NFA拼接正则表达式转NFA选择正则表达式转NFA重复正则表达式转NFA 正则表达式转NFA–实战部分 空正则表达式转NFA 转换步骤&#xff1a; 构建1个只有1个状态的NFA起始状态也是接受状态没有规则&#xff0c;即规则集为空 单字符正则表达式…

稳态模型下的异步电机调速【运动控制系统】

异步电动机&#xff1a; n1是同步转速&#xff08;电机和磁芯同步时候的转速&#xff09; n&#xff1a;电机的实际转速 异步电动机恒压频比的概念&#xff0c;为什么基频以下可以采取恒压频率&#xff0c;基频以上不可以采用恒压频比&#xff1a; 异步电动机的恒压频比&…

【KWDB 创作者计划】_算法篇---Stockwell变换

文章目录 前言一、Stockwell变换原理详解1.1 连续S变换定义1.2 离散S变换1.3简介 二、S变换的核心特点2.1频率自适应的时频分辨率2.1.1高频区域2.1.2低频区域 2.2无交叉项干扰2.3完全可逆2.4相位保持2.5与傅里叶谱的直接关系 三、应用领域3.1地震信号分析3.2生物医学信号处理3.…