详细介绍:Linux----gcc、g++的使用以及一些问题

news/2025/9/28 16:42:00/文章来源:https://www.cnblogs.com/ljbguanli/p/19117083

详细介绍:Linux----gcc、g++的使用以及一些问题

程序生成过程

在学习C语言的时候,我们知道,程序的生成需要经过预处理、编译、汇编、链接。

预处理

展开头文件、处理条件编译、删除注释、处理宏。我们来看一段代码(centos 7.6):就是预处理时主要就

预处理后的代码,如果不用-o并且重命名,那么会直接把预处理后的代码打印到终端:就是在这里直说了,用gcc/g++编译程序时,直接g++ 文件名,就会生成一个a.out的可执行文件,./a.out就能够执行它。但是现在我们要看预处理后的代码是怎样的,执行下面的指令会生code.i,他

用vim打开code.i观看预处理后的代码,这是代码头部:

这是到末了,可以看到多出来了一万多行代码,这都是展开的头文件,可以看到处理了宏定义,删除了注释,处理了条件编译:

编译

执行下面指令生成编译后的代码

汇编语言。编译把预处理后的 C/C++ 源码转成就是vim打开,发现都汇编代码。语法检查、优化都在这一步完成。输出是 .s 汇编文件。

汇编

虽然生成了.o目标档案,但是仍然还不能执行,为什么呢?因为哪怕code.cpp变成了code.o,不过其中调用的一些库函数仍然找不到他们各自的定义。比如可能会调用printf,这时编译器只知道“有个叫 printf 的函数”,但没有它的地址。这些符号要等到链接阶段才能被解析并指向正确的库函数。

链接

此时执行如下链接指令生成可执行程序,并运行:

这里就牵扯到了一个问题,什么是库呢?

头文件中一般只有库函数的声明,而库函数的定义在库中。这些函数实现都在名为 libc.so.6 的库文档中,g++一般会到平台默认的搜索路径“/usr/lib”下进行查找,链接libc.so.6 库函数与.o文件,这样就能构建printf函数,这里的库有两种:静态库和动态库。那么如何进行链接?

静态库

一堆 .o 目标文件打包在一起(通常扩展名是 .a,Windows 下是 .lib)。在编译时,编译器会把需要的函数代码 直接拷贝到可执行程序里。可执行文件体积大(因为包含了库的代码)。程序运行时不依赖外部库文件。更新库时,用到了该库的程序都需要重新编译程序。
静态库像是 把工具书的内容直接复印到你的作业里,你交出去的作业自己就全了,不需要再带工具书。

动态库

也是一堆函数的二进制代码,但在运行时才被加载(Linux 下 .so,Windows 下 .dll)。可执行文件里只保存“引用”,程序启动或运行时再从系统里找到对应的库。可执行文件体积小(只存符号引用)。多个程序可以共享同一个库,节省内存。更新库文件时,不用重新编译程序,只要接口没变,程序就能用新的功能。
动态库像是 写作业时引用一本公共图书馆的工具书,你的作业本身不包含解释,但只要图书馆有这本书,就能看懂。那么当链接时链接的是动态库的话就是动态链接,反之就是静态链接。

动态链接

g++一般默认是动态链接,ldd 显示的是程序运行时需要加载的动态库,以及它们在系统里的位置,查看刚刚生成的code:

静态链接

可以用指令要求静态链接,前提是有静态库文件,可以用指令下载g++与gcc的静态库:sudo yum install glibc-static libstdc++-static。紧接着使用-static选项要求静态链接,行看到静态链接生成的可执行文件大小特别大。

如果不指定的话,一般是动态链接优先,若是没有动态库,会调用静态库进行静态链接。

对比总结

特性静态库 .a/.lib动态库 .so/.dll
链接时间链接时拷贝进可执行文件中运行时到对应库加载
可执行文件大小大(包含库代码)小(只保存引用)
运行依赖不依赖外部库依赖库文件存在
更新维护改库需重新编译更新库即可
内存占用每个程序有自己的副本多个程序共享一份

静态库:编译时打包进工具,独立但臃肿;动态库=运行时加载,共享但有依赖。

release与debug版本

可执行文件一般在发布时是release版本,程序在开发时是debug版本,形成可执行文件时添加了debug信息。默认情况下,gcc/g++ 编译出来的程序既不是严格的 Debug,也不是严格的 Release通过,能够理解为一个未优化的普通构建。它只是编译器直接把源代码翻译成机器码生成可执行文件,适合迅速测试和开发。

产生debug版本指令:

debug版本下因为添加了debug信息,所以要比默认的大一些。

release版本:

g++ code.cpp -O2 -DNDEBUG -o code_release
strip code_release   # 可选,去掉符号表,减小体积

参数说明

  • -O2 → 优化编译,平衡性能和编译时间。消除冗余代码、循环优化内联函数等

  • -O3 → 更激进优化,可选。函数内联扩展等

  • -DNDEBUG → 禁用 assert() 断言

  • -o code_release → 输出文件名

  • strip → 删除符号表(删除调试信息),让可执行文件更小,但不影响执行。

Release 版本优化执行速度,不保留调试信息,Debug 版本则相反,保留调试信息、不开优化。观察文件大小:

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

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

相关文章

网页和网站有什么关系网络建设与维护是什么

工厂模式用于干掉大量的if-else ,策略模式用于挪去臃肿的业务代码,还可以进一步升级加上模板模式,以及抽取成Starter public interface HandlerStrategy extends InitializingBean {void findSyncOrders(); }public class SalesPlatformFact…

网站logo怎么设计哪个网站可以做立体字的模板

文章目录1. 题目2. 解题1. 题目 设计一个支持下述操作的食物评分系统: 修改 系统中列出的某种食物的评分。返回系统中某一类烹饪方式下评分最高的食物。 实现 FoodRatings 类: FoodRatings(String[] foods, String[] cuisines, int[] ratings) 初始化…

电子商务网站开发常用工具建筑资料管理规程

最近很多朋友(Andrew、BENEN1)都在问如何让Lookup显示InActive记录,研究后发现可以通过Plugin来实现这样的功能,MSCRM真是无所不能,没有做不到,只有想不到!实现步骤:一、自定义实体->工程项目->表单和视图->查找视图->…

网站制作有哪些技术外贸电商网站建设

RPC和WebService的关系RPC(Remote Procedure Call)— 远程过程调用,是一个很大的概念, 它是一种通过网络从远程计算机程序上跨语言跨平台的请求服务,rpc能省略部分接口代码的开发,可以跨机器之间访问对象(java rmi),可以有更方便的…

学院网站建设时间控制变更申请表北京软件开发公司排行榜最新

在Spring Cloud Gateway中,GlobalFilter接口允许你创建全局过滤器,这意味着该过滤器会应用到所有的路由上,无论它们是否匹配特定的路由规则。Ordered接口用于定义过滤器的执行顺序。 以下是一个AuthFilter类的示例,该类实现了Glo…

同步和互斥的基本概念

同步与互斥的基本概念 临界资源 我们将一次仅允许一个进程使用的资源称为临界资源 什么是进程同步 直接制约关系,他是指为了完成某种任务而建立的两个或多个进程,这些进程因为需要某些位置上协调他们的工作次序而产生…

Sep 28

只整理 T1, T2. 原题是 「ROI 2012 Day 1」密码 和 「ROI 2012 Day 2」剧院始于演员,可以与 LOJ 提交。 T1 考试的时候忘记 return 0, 导致一口气把所有答案都输出出来了,100->30,再次警示使用 break 的时候一定…

图像采集卡:连接镜头与机器的“视觉神经”,释放工业智能核心动力

什么是图像采集卡? 身处机器视觉、智能制造、医疗影像等行业前沿的你,是否常听到“图像采集卡”这个词?它绝非简单的配件,而是现代工业应用中的关键“视觉神经”。简单来说,图像采集卡(又称视频采集卡或帧抓取器…

2025 年生态木厂商最新推荐榜单:TOP 前五企业实力解析及厂商选择指南生态木方通/户外地板/装饰线条/隔断/背景墙厂商推荐

在环保装饰材料需求持续攀升的当下,生态木(WPC)凭借环保、耐用等优势,成为家装与工装领域的热门选择,但市场乱象却让采购方陷入困境。一方面,大量中小品牌缺乏核心技术,产品在防水、防火、环保性上不达标,且同…

盲盒一番赏小应用用户需求分析:从行为动机到功能诉求的深度拆解

盲盒一番赏小应用用户需求分析:从行为动机到功能诉求的深度拆解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

C++ IO 库全方位解析:从基础到实战 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

解题报告-泥路(muddyroad.*)

泥路(muddyroad.*) 题目背景 yxr 热爱多级跳,而且他十分喜欢在泥路上练习多级跳。 不幸的是,有一天下雨了,yxr 穿着的却是一双新的鞋子。yxr 心疼自己的鞋子,但是又不舍得放弃练习多级跳,于是他决定先勘察泥路。 …

洛谷P10112 [GESP202312 八级] 奖品分配

传送门 原题 题目描述 班上有 \(N\) 名同学,学号从 \(0\) 到 \(N-1\)。有 \(M\) 种奖品要分给这些同学,其中,第 \(i\) 种奖品总共有 \(a_i\) 个 (\(i=0,1, \cdots ,M-1\))。 巧合的是,奖品的数量不多不少,每位同…

P10400 『STA - R5』消失的计算机

传送门 原题 题目描述 本题为提交答案题。 后台有一个正整数 \(n\)(你不知道 \(n\) 具体的值)。 你有 \(10^3\) 个变量 \(p_1,p_2,\cdots,p_{10^3}\),初始 \(p_1=n\),\(p_2=p_3=\cdots=p_{10^3}=0\)。 你需要写一个…

2025 地坪研磨机厂家推荐权威推荐排行榜:品牌深度解析及格力 / 宁德时代合作案例速递水磨石/遥控式/座驾式/小型地坪研磨机厂家推荐

伴随城市更新与智能制造升级,环氧地坪、固化混凝土等工程对研磨设备的精度、效率与稳定性提出严苛要求,地坪研磨机市场需求年均复合增长率达 3.5%。但市场中产品质量悬殊,动力不足、精度偏差、售后滞后等问题频发,…

太原网站建设 网站制作wordpress3.9主题

一、仅需实现在线预览,且文件地址公网可访问 (一)微软office免费预览(推荐) 支持doc/docx/xls/xlsx/ppt/pptx等多种office文件格式的免费预览 //示例代码//​在https://view.officeapps.live.com/op/view.aspx?src…

中国工信备案查询网站免费自动刷访客量

traceroute 是用来检测发出数据包的主机到目标主机之间所经过的网关数量的工具。traceroute 的原理是试图以最小的TTL发出探测包来跟踪数据包到达目标主机所经过的网关,然后监听一个来自网关ICMP的应答。发送数据包的大小默认为 38个字节。 通过traceroute我们可以知…

2025 年最新推荐铝塑膜源头厂家权威排行榜:聚焦 3000㎡厂房与完整产业链的优质企业盘点复合/防锈防潮/木箱包装/设备包装铝塑膜厂家推荐

在当前工业包装领域,铝塑膜因高阻隔、耐穿刺、密封性强等特性,已成为木箱包装、货运物流、化工储存等行业长途运输与长期保存货物的核心材料。但市场现状却不容乐观,大量厂家存在基材质量差、工艺精度低、定制能力弱…

2025 年真空袋生产厂家最新权威推荐排行榜:TOP 级企业工艺、服务及适配场景全景对比指南木箱/设备/海运防潮/铝塑/电柜真空袋厂家推荐

在工业产品仓储运输环节,包装防护失效引发的问题日益凸显 —— 潮湿导致精密部件锈蚀、穿刺造成化工原料泄漏、密封不佳引发货物变质,不仅带来直接经济损失,更严重影响供应链稳定性。当前市场上真空袋厂家工艺水平悬…

《码界飞升传II:数据星辰异界问道》

【第一卷大数据筑基】 第1章:HDFS剑阵!分布式存储定乾坤 第2章:YARN御兽!资源调度的万兽谱 第3章:MapReduce证道!分而治之的无上心法 第4章:Hive悟道!SQL化繁为简的通天梯 【第二卷NoSQL风云】 第5章:HBase觉…