gcc/g++的使用:

目录

(1). 程序的翻译过程

预处理: gcc -E 源文件

编译: gcc -S 源文件

汇编:gcc -c 源文件

连接:

(2) 语言的自举(也叫 编译器的自举):

(3). 查看可执行程序在连接时依赖的库:  ldd  可执行程序的名字 。

(4). 函数库: 函数库一般分为 静态库 和 动态库

(5). 连接方式: 动态连接 , 静态连接。

(6). 编译:gcc 对 文件进行编译后, 生成的是可执行程序


(1). 程序的翻译过程

预处理(进行宏替换) , 编译(生成汇编) , 汇编(生成机械可执行代码) , 连接(生成可执行文件/库文件)

gcc的选项是 E , S ,c

预处理: gcc -E 源文件

gcc -E code.c -o test.i :  生成 预处理后的文件 test.i

预处理后文件中的内容还是c语言

编译: gcc -S 源文件

gcc -S  test.i -o  test.s : 生成 编译后的文件 test.s

开始进行程序的翻译, 形成汇编。此时 文件中的是 汇编代码

汇编:gcc -c 源文件

gcc  -c  test.s  -o  test.o : 生成 可重定位目标文件 test.o

文件中的内容是 二进制内容

连接:

gcc  -o  test  test.o  : 生成可执行程序

连接是 把 xxx.o 文件 和 标准库 进行关联, 构建可执行程序

-static 选项: 进行静态连接。 不加-static 默认是动态连接。

gcc -o  test_static  test.o  -static

(2) 语言的自举(也叫 编译器的自举):

先有汇编语言 还是先有 汇编编译器? 答案是先有汇编编译器。  先用二进制 写一个 编译器 ,该编译器可以使得 汇编语言 翻译为 二进制(称这个为 二进制编译器)。 然后拿 汇编语言 来写一个 新的汇编编译器, 然后用 二进制编译器 , 编译形成一个全新的编译器。 这个过程叫做 语言的自举,也叫做 编译器的自举

(3). 查看可执行程序在连接时依赖的库:  ldd  可执行程序的名字 。

此处的libc.so.6 是 test 可执行程序 依赖的库。  Libc.so.6 是 c语言标准库

如下图,ls命令 也依赖 libc.so.6库,证明 ls命令也是c语言写的。

一般命名中包含 .so 或以 .so 结尾 的库 是动态库。 显然 libc.so.6 就是一个动态库。

(4). 函数库: 函数库一般分为 静态库 和 动态库

动态库: .so (Linux) , .dll (windows)

静态库: .a (Linux) , .lib (windows)

云服务器默认没有按照c/c++的标准库的静态库

安装c语言静态库: yum install -y glibc-static

安装c++静态库: yum install -y libstdc++-static

(5). 连接方式: 动态连接 , 静态连接。

静态连接的前提: 有静态库

静态连接: 把我们要访问的方法实现,拷贝到我们自己的可执行程序中

i. 静态连接的优点:不依赖其他库,即使库丢失也无所谓,照样可以运行

ii. 静态连接的缺点:比较浪费资源。 形成的可执行程序的体积较大

动态连接的前提: 有动态库

动态连接: 记录我们要访问的方法实现的地址,访问时,通过地址跳转到对于地址来访问方法

i. 动态连接的优点: 比较节省资源。 形成的可执行程序的体积比较小

ii. 动态连接的缺点: 一旦动态库缺失,所有程序都无法执行。 即如果 libc.os.6 删除后,就无法运行用c语言写的程序了

查看文件是静态连接还是动态连接的方法: file 命令。 语法: file  文件名

即 dynamically  linked (uses  shared  libs) 是动态连接。 statically  linked 静态连接

(6). 编译:gcc 对 文件进行编译后, 生成的是可执行程序

选项: -o ,  相当于是 将程序 生成为文件 并指定名称

gcc  编译并生成文件的语法:

gcc  -o  生成的文件的名字   源文件  , 也可以写为  gcc 源文件 -o 生成的文件的名字

是把源文件 进行编译,然后把 编译后的可执行程序 命名为 此处的可执行程序的名字

然后执行可执行程序即可。

Eg:

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

指针 (六)

OK,书接上回,咱们继续: 一 . 函数指针变量 (1)函数指针变量的创建 首先我们得明白,什么是函数指针变量呢?从我们之前学习过的整型指针,数组指针的相关知识当中,通过类…

OpenAI API key not working in my React App

题意:OpenAI API 密钥在我的 React 应用中不起作用 问题背景: I am trying to create a chatbot in my react app, and Im not able to generate an LLM powered response. Ive been studying documentation and checking out tutorials but am unable …

基于STM32F407ZGT6——看门狗

独立看门狗 独立看门狗的时钟由独立的RC 振荡器LSI 提供,即使主时钟发生故障它仍然有效,非常独立。 LSI 的频率一般在30~60KHZ 之间,根据温度和工作场合会有一定的漂移, 所以独立看门狗的定时时间并不一定非常精确,只适…

国学盛典 致敬先贤 《老子与道德经》纪录片研讨会在北京善品堂国学馆圆满落幕

9月10日,《老子与道德经》纪录片研讨会在北京善品堂国学馆圆满落幕。中国著名表演艺术家、曾饰演央视86版电视剧《西游记》中“孙悟空”的六小龄童先生与两百余人传统文化传播者、践行者、爱好者齐聚一堂,共同交流。本次会议由中国文化促进会福文化工作委…

【自动驾驶】决策规划算法 | 数学基础(三)直角坐标与自然坐标转换Ⅱ

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

GoPlantUML,go代码到类图

前言 GoPlantUML 是一个开源工具,旨在简化从 Go 源代码生成 PlantUML 图的过程。使用 GoPlantUML,开发人员可以毫不费力地可视化其 Go 项目中的结构和关系,从而有助于代码理解和文档编写。通过解析 Go 源代码并生成 PlantUML 图,…

软件安全、逆向分析、加密与解密--crackme2详解

本次使用到的软件有:PEiD、IDA、X32dbg 刚学逆向不久,可能有些地方会有错误,欢迎各位大佬指导 执行 运行程序 点击About 点击确定,输入如图数据 点击try Now 点击确定,回到主界面 点击Exit,退出 查壳&a…

猫头虎分享:Python库 Pandas 的简介、安装、用法详解入门教程

🐯猫头虎分享:Python库 Pandas 的简介、安装、用法详解入门教程 摘要 今天猫头虎带大家一起来探讨Python数据分析神器——Pandas的完整入门教程!本篇博客将深入介绍Pandas的功能,从安装到基础用法,再到常见问题解决&a…

Python 课程14-TensorFlow

前言 TensorFlow 是由 Google 开发的一个开源深度学习框架,广泛应用于机器学习和人工智能领域。它具有强大的计算能力,能够运行在 CPU、GPU 甚至 TPU 上,适用于从小型模型到大规模生产系统的各种应用场景。通过 TensorFlow,你可以…

FinOps三人行:共话FinOps云成本管理与AI的未来在线分享(文字+视频)

前言: 在数字化浪潮的推动下,云成本管理(Cloud Financial Management,简称FinOps)正逐渐成为企业关注的焦点。在2024年9月4日,一场关于云成本管理与人工智能(AI)未来的深入讨论在线…

体感魂斗罗-开篇

文章目录 前言新的目标Flag 前言 黑神话悟空大火,9月14,周鸿祎在抖音平台分享了360团队用两天的业余时间将《黑神话:悟空》爆改为体感游戏的过程,通过身体动作来控制游戏中的角色,实现更加自然和直观的操作方式。 把…

2025年最新大数据毕业设计选题-基于Spark分析相关

选题思路 回忆学过的知识(Python、Java、Hadoop、Hive、Sqoop、Spark、算法等等。。。) 结合学过的知识确定大的方向 a. 确定技术方向,比如基于Hadoop、基于Hive、基于Spark 等等。。。 b. 确定业务方向,比如民宿分析、电商行为分析、天气分析等等。。。…

2025年最新大数据毕业设计选题-基于Hive分析相关

选题思路 回忆学过的知识(Python、Java、Hadoop、Hive、Sqoop、Spark、算法等等。。。) 结合学过的知识确定大的方向 a. 确定技术方向,比如基于Hadoop、基于Hive、基于Spark 等等。。。 b. 确定业务方向,比如民宿分析、电商行为分析、天气分析等等。。。…

【bug】通过lora方式微调sdxl inpainting踩坑

报错内容 ValueError: Attempting to unscale FP16 gradients. 报错位置 if accelerator.sync_gradients:params_to_clip (itertools.chain(unet_lora_parameters, text_lora_parameters_one, text_lora_parameters_two)if args.train_text_encoderelse unet_lora_parameters…

Oracle 19c异常恢复—ORA-01209/ORA-65088---惜分飞

由于raid卡bug故障,导致文件系统异常,从而使得数据库无法正常启动,客户找到我之前已经让多人分析,均未恢复成功,查看alert日志,发现他们恢复的时候尝试resetlogs库,然后报ORA-600 kcbzib_kcrsds_1错误 2024-09-15T17:07:32.55321508:00 alter database open resetlogs 2024-09-…

深入理解IP地址分类及子网划分详解

在互联网时代,IP地址是网络通信的基础。无论是访问网站、发送电子邮件,还是进行数据传输,IP地址都扮演着至关重要的角色。本文将详细解析IP地址的分类及子网划分的原理,帮助你更好地理解网络架构及其应用。 一、什么是IP地址 IP…

电信创维光猫DT741超级密码

正常的D740系是创维系列光猫如:SK-D740 之类的超密获取办法-光猫/adsl/cable无线一体机-恩山无线论坛 但是我这个固件是DT741v1.0 我只能说很S -B,这个版本如果是1.02那就可以很轻松的去用通用办法解决,但是呢!还有办法就是用最传…

数据恢复精灵排行榜:四款优秀软件推荐!

无论是误删的照片,还是格式化硬盘后的重要文件,每一次意外的数据丢失都可能给我们带来不小的麻烦。在这样的背景下,“数据恢复精灵”应运而生,它们能够帮助我们找回那些似乎已经消失无踪的信息。下面,就让我们一起来看…

【 html+css 绚丽Loading 】 000052 璇玑转轮

前言:哈喽,大家好,今天给大家分享今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 &#x1f…

Cortex-A7的GIC(通用中断控制器):边沿触发和电平触发中断处理流程

0 资料 ARM Generic Interrupt Controller Architecture version 2.0 Architecture Specification1 边沿触发和电平触发中断处理流程 1.0 边沿触发和电平触发的区别 边沿触发(Edge-triggered) This is an interrupt that is asserted on detection of…