当前位置: 首页 > news >正文

makefile 学习(3):C++的编译及库文件的生成与链接

1. 介绍

C++语言的相关后缀

  • .a 文件是一个静态库文件
  • .c,.c++ ,.cp,.cpp,.cc,.cxx 这几种后缀都可以表示c++的源文件
  • .h ,.hpp c++语言的头文件
  • .i 是c++预处理文件
  • .o 目标文件
  • .s汇编语言的文件
  • .so 动态库或者共享库或者称为运行时库

2. C++编译

2.1 预处理

g++ -E helloworld.cpp   # 虽然预处理了,但不会输出.i文件
g++ -E helloworld.cpp -o helloworld.i   # 指定输出.i文件
  • -E选项告诉编译器只进行预处理操作
  • -o 选项把预处理的结果输出到指定文件

2.2 生成汇编语言

g++ -S helloworld.cpp
g++ -S helloworld.cpp -o helloworld.s
  • -S 选项告诉编译器,进行预处理和编译成汇编语言操作

每个平台对应的汇编语言的形式是不同的,例如有很多型号的开发板,有很多型号的CPU

2.3 源文件生成目标文件

g++ -c helloworld.cpp   # 默认生成 helloworld.o 目标文件
g++ -c helloworld.cpp  -o harumph.o  # 指定目标文件名
#编译多个.c文件
g++ -c helloworld.cpp helloworld1.cpp hellworld2.cpp

2.4 生成可执行文件

(1) 单个源文件编译为可执行文件

  • 注意: 后面2个命令执行后并没有按编译过程出现.i,.s,.o文件,并不意味着没有经历这些过程
g++ helloworld.cpp
g++ helloworld.cpp -o howdy

执行程序

./可执行文件

(2) 多个源文件编译为可执行文件

g++ hellomain.cpp  sayhelo.cpp -o hello

3. 生成库文件

3.1 生成静态库

(1) 编译成.o文件

g++ -c [.cpp] -o [自定义文件名]  #单个源文件
g++ -c [.cpp] [.cpp] ...   # 多个源文件

(2) 编译静态库

ar -r [lib自定义库名.a]  [.o] [.o] ...

(3) 链接成可执行文件

g++ [.cpp] [.a] -o [自定义输出文件名]
g++ [.cpp] -o [自定义输出文件名] -l[库名] -L[库所在路径]

3.2 生成动态库

(1) 编译二进制.o文件

g++ -c -fpic [.c/.cpp] [.c/.cpp] ...

(2) 编译动态库

g++ -shared [.o] [.o] ... -o [lib自定义库名.so]

(3) 链接动态库到可执行文件

g++ [.c/.cpp] -o [自定义可执行文件名] -l[库名] -L[库路径] -Wl,-rpath=[库路径]

4. 总结

(1). 编译过程

源文件.cpp文件 -> 预编译成.i文件 -> 编译成汇编语言.s -> 汇编成.o文件 -> 链接成可执行文件(名字自定义,后缀没关系)

(2). 编译过程命令

  • 预处理
g++ -E [.cpp源文件] -o [自定义输出文件名.i]
  • 编译成汇编语言[隐藏了预处理操作]
g++ -S [.cpp源文件]
  • 编译目标文件(二进制文件,可用于链接)
g++ -c [.cpp源文件] [.cpp源文件] [...] (可选项:-o [自定义文件名])

(3). 库

静态库

  • 编译(先转成.o文件,在编成lib(自定义库名).a)
g++ -c [.cpp源文件] [.cpp源文件] [...] (可选项:-o [自定义文件名])  #编译目标文件
ar -r lib[自定义库名].a  [.o文件] [.o文件]  [...]

动态库

  • 编库
    • 第一种做法,先转成.o文件,再编成.so文件
    g++ -c fpic [.cpp源文件]  [.cpp源文件]  [...]     
    g++ -shared [.o文件]  [.o文件] [...] -o lib[库名].so```
    
  • 第二种做法,直接转成.so
g++ -fpic -shared  [.cpp源文件]  [.cpp源文件]   [...]  -o  lib[库名].so
  • 链接
g++ [main文件] -o [自定义输出可执行文件名] -l[库名] -L[库所在路径] -Wl, -rpath=[库所在路径]

可以看出C++的编译和库连接与C的编译和链接,基本上都是一模一样。区别很简单:

  • 命令中 c++用的是g++编译器, c语言用的是 gcc编译器
  • 并且g++编译器同时也支持.c c文件的编译

相关文章:

makefile 学习(3):C++的编译及库文件的生成与链接

1. 介绍 C语言的相关后缀 .a 文件是一个静态库文件.c,.c ,.cp,.cpp,.cc,.cxx 这几种后缀都可以表示c的源文件.h ,.hpp c语言的头文件.i 是c预处理文件.o 目标文件.s汇编语言的文件.so 动态库或者共享库或者称为运行时库 2. C编译 2.1 预处理 g -E helloworld.cpp # 虽…...

Ceph crush运行图

Crush map介绍 ceph集群中由monitor负责维护的运行图包括: Monitor map:监视器运行图osd map:osd运行图PG map:PG运行图Crush map:crush运行图Mds map:mds运行图 crush map是ceph集群物理拓扑的抽象&…...

【分布族谱】泊松分布和二项分布、正态分布的关系

文章目录 泊松分布和二项分布的关系和正态分布的关系 泊松分布 如果在有限时间 ( 0 , 1 ) (0,1) (0,1)内进行 n n n次伯努利实验,那么每次伯努利实验所占用的时间为 1 n \frac{1}{n} n1​,按照自然规律,一件事情肯定是时间越长越容易发生&am…...

关于QTreeWidget的setData函数

当使用 Q T r e e W i d g e t I t e m QTreeWidgetItem QTreeWidgetItem 的 s e t D a t a setData setData 方法时,需要传递三个参数,分别是列索引、角色和数据。 列索引:表示要设置数据的列的索引。 Q T r e e W i d g e t I t e m QTre…...

Microsoft Office 2003的安装

哈喽,大家好。今天一起学习的是office2003的安装,这个老版本的office可是XP操作系统的老搭档了,有兴趣的小伙伴也可以来一起试试手。 一、测试演示参数 演示操作系统:Windows XP 不建议win7及以上操作系统使用 系统类型&#xff…...

使用Spring Boot和Spring Cloud实现多租户架构:支持应用多租户部署和管理

使用Spring Boot和Spring Cloud实现多租户架构:支持应用多租户部署和管理 一、概述1 什么是多租户架构?2 多租户架构的优势3 实现多租户架构的技术选择 二、设计思路1 架构选型1.1 Spring Boot1.2 Spring Cloud 2 数据库设计3 应用多租户部署3.1 应用隔离…...

智聚北京!相约全球人力资源数智化峰会

人力资源是推动经济社会发展的第一资源。作为我国经济压舱石的中央企业在对标世界一流企业和管理提升方面的持续创新,各行业领军企业围绕组织变革、管理升级、全球化发展走深走实。人力资源管理正从传统职能管理与管控,向紧贴业务战略实现、组织边界和人…...

工业缺陷检测数据及代码(附代码)

介绍 目前,基于机器视觉的表面缺陷检测设备已广泛取代人工视觉检测,在包括3C、汽车、家电、机械制造、半导体与电子、化工、制药、航空航天、轻工等多个行业领域得到应用。传统的基于机器视觉的表面缺陷检测方法通常采用常规图像处理算法或人工设计的特征加分类器。一般而言…...

CentOS 安装MongoDB 6.0

一、安装依赖 yum install libcurl openssl xz-libs 二、下载安装包 安装包下载地址https://www.mongodb.com/try/download/community这里我选择的是 选择RedHat / CentOS 7.0平台的原因是我的操作系统使用的是CentOS 7.0的,需要下载与操作系统匹配的安装包 三、…...

美团面试,被拷打了一小时....

刚从美团走出来,被拷打了一小时…越想越觉得可惜,回想面试经过,好好总结了几个点,发现面试没过的主要原因是在几个关键的问题没有给到面试官想要的答案。从而失去了这次宝贵的机会。 根据你的工作经历,说说你对质量保证…...

017+C语言中函数栈帧的创建与销毁(VS2022环境)

0.前言 您好,这里是limou3434的一篇个人博文,感兴趣的话您也可以看看我的其他文章。本次我将和您一起学习在C语言中函数栈帧的概念。 1.学习函数栈帧的意义 局部变量是怎么穿创建的?为什么局部变量的值是随机的函数是怎么传参的&#xff1…...

马斯克们叫停 GPT-5,更像是场行为艺术

目录 01 联名信说了什么? 02 发起方是谁? 03 谁签署了联名信? 04 联名信有哪些问题?三巨头的另外两位 Sam Altman 的表态 其他值得关注的署名者 比如马斯克。 另一个位于前列的署名者是 Stability AI 的创始人 Emad Most…...

事务基础知识

第13章 事务基础知识 1. 数据库事务概述 1.1 基本概念 **事务:**一组逻辑操作单元,使数据从一种状态变换到另一种状态。 **事务处理的原则:**保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种…...

国产高性能DSP音频处理芯片的工作原理以及应用领域

DSP芯片是数字信号处理器的简称,它是一种专门用于数字信号处理的微处理器,它可以对数字信号进行高速运算和处理。DSP是一类嵌入式通用可编程微处理器,主要用于实现对信号的采集、识别、变换、增强、控制等算法处理,是各类嵌入式系…...

BEVDet4D 论文学习

1. 解决了什么问题? 单帧数据包含的信息很有限,制约了目前基于视觉的多相机 3D 目标检测方法的性能,尤其是关于速度预测任务,要远落后于基于 LiDAR 和 radar 的方法。 2. 提出了什么方法? BEVDet4D 将 BEVDet 方法从…...

【设计模式与范式:创建型】43 | 单例模式(下):如何设计实现一个集群环境下的分布式单例模式?

上两节课中,我们针对单例模式,讲解了单例的应用场景、几种常见的代码实现和存在的问题,并粗略给出了替换单例模式的方法,比如工厂模式、IOC 容器。今天,我们再进一步扩展延伸一下,一块讨论一下下面这几个问…...

Metal入门学习:绘制渲染三角形

一、编程指南PDF下载链接(中英文档) 1、Metal编程指南PDF链接 https://github.com/dennie-lee/ios_tech_record/raw/main/Metal学习PDF/Metal 编程指南.pdf 2、Metal着色语言(Metal Shader Language:简称MSL)编程指南PDF链接 https://github.com/dennie-lee/ios_te…...

python 中常见变量类型

数值 a 10 b 123 … 字符串 在python中 用单引号’‘和双引号""括起来的都是字符串,不使用引号括起来的不是字符串,字符串是使用最多的数据类型,用来表示一段文本信息。 比如: a ‘123’ b “123” 字符串之间可以用加法运算…...

SVN使用教程(一)

文章目录 前言一、SVN是什么?二、SVN和Git对比,有什么优势?三、SVN主要应用四、SVN仓库五、安装SVN客户端 前言 提示:这里可以添加本文要记录的大概内容: 在制作系统或者写文档,都需要用于管理和跟踪开发…...

【5.19】四、性能测试—指标、种类

目录 4.1 性能测试概述 4.2 性能测试的指标 4.3 性能测试的种类 为了追求高质量、高效率的生活与工作,人们对软件产品的性能要求越来越高,例如软件产品要足够稳定、响应速度足够快,在用户量、工作量较大时也不会出现崩溃或卡顿等现象。人们…...

如何处理phpMyAdmin提示配置文件读取失败_文件属组与读写权限调整

根本原因是PHP进程无法读取config.inc.php文件,主因是系统级权限问题:Web服务器用户(如www-data)无读取权限,或文件权限为666/660等不安全组合,或SELinux/AppArmor拦截,或符号链接目标权限错误。…...

从零开始:手把手教你搭建与操作主流向量数据库

1. 为什么你需要一个向量数据库? 想象一下你正在开发一个智能相册应用。当用户上传一张猫咪照片时,系统需要从数百万张图片中快速找到所有相似的猫咪照片。传统数据库只能做精确匹配(比如"文件名cat001.jpg")&#xff0…...

【算法日记】Day 11 动态规划专题——区间DP之基于范围中划分点的讨论

Abstract:#动态规划 #区间DP #多边形剖分 1. 题目 题目:LeetCode 1039. 多边形三角剖分的最低得分核心思路:定义dp[i][j]表示从顶点i到顶点j构成的多边形(凸多边形,顶点按顺序排列)通过三角剖分能得到的最…...

fpga系列 HDL:跨时钟域同步 双触发器同步器

目录双触发器同步器(Two-Flip-Flop Synchronizer)示例代码:双触发器同步器的优缺点优点:缺点:适用场景:应用实例:同步来自spi_slave的单个使能信号跨时钟域的设计需要特别小心,以避免…...

完整Modbus协议栈:pymodbus核心组件详解

完整Modbus协议栈:pymodbus核心组件详解 【免费下载链接】pymodbus A full modbus protocol written in python 项目地址: https://gitcode.com/gh_mirrors/py/pymodbus PyModbus是一个用Python编写的完整Modbus协议实现,提供了客户端、服务器和模…...

西门子ST20 PTO脉冲与台达ASDA-A2伺服驱动器的精准运动控制实践

1. 西门子ST20与台达ASDA-A2的硬件连接实战 第一次接触西门子ST20的PTO脉冲控制台达伺服时,我也被那一堆接线端子搞得头晕。后来发现只要抓住几个关键点,接线就像拼乐高一样简单。先说最重要的安全规范:务必在断电状态下操作,伺服…...

OpenClaw+优云智算Coding Plan:从灵感到成文,再到发布的全流程AI自动化肆

1.安装环境准备 1.1.查看物理内存 [rootaiserver ~]# free -m 1.2.操作系统版本 [rootaiserver ~]# cat /etc/redhat-release 1.3.操作系统内存 [rootaiserver ~]# df -h /dev/shm/ 1.4.磁盘空间 [rootaiserver ~]# df -TH [rootaiserver ~]# df -h /tmp/ [rootaiserver ~]# d…...

Windows系统下Mamba-SSM避坑指南:从WSL配置到编译成功

1. 为什么选择WSL安装Mamba-SSM Mamba-SSM作为新一代深度学习架构,在处理长序列任务时展现出显著优势。但官方仅支持Linux系统,这让Windows用户面临两难选择:要么重装系统,要么放弃体验新技术。WSL(Windows Subsystem …...

Midscene.js:AI视觉驱动自动化,三分钟告别重复浏览器操作

Midscene.js:AI视觉驱动自动化,三分钟告别重复浏览器操作 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 你是否还在为每天重复的浏览器操…...

分享 种 .NET 桌面应用程序自动更新解决方案云

一、Actor 模型:不是并发技巧,而是领域单元 Actor 模型的本质是: Actor 是独立运行的实体 Actor 之间只通过消息交互 Actor 内部状态不可被外部直接访问 Actor 自行决定如何处理收到的消息 Actor 模型真正解决的是: 如何在不共享状…...