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

Linux Ubuntu 24.04 C语言gcc编译过程详解

下面是Hello World程序源代码文件hello.c的内容,我们将以它为例来说明源文件到可执行文件的形成过程,主要分4步:预处理、汇编、机器码、链接。

#include <stdio.h>
int main ()
{printf ( "hello, world \n " );return 0;
} 

第一步:预处理(preprocessing)

预处理是将include文件插入,将宏定义展开,根据条件编译命令选择要使用的代码,最后将这些代码输出到一个“.i”文件中

# gcc -E -o hello.i hello.c

-E 表示只运行C预编译器

-o file/path 表示输出的文件

1. 默认的搜索头文件的位置在 /usr/include/,可用-I dir/path/ 添加搜索头文件的位置。

2. #include有两种形式: #include <syshead.h>    #include "userhead.h"
用<>表示包含系统的头文件,用双引号包含用户自定义的头文件。
1)使用<>包含的头文件一般会先搜索 -I 选项后的路径,之后就是标准的系统头文件路径(/usr/include/)
2)用""号包含的头文件会首先搜索当前的工作目录,之后搜索<>所搜索的路径。

3. 可用下面的命令寻找头文件库中指定的文件

find /usr/include/ -name socket.h

第二步:将C语言转换为汇编语言

-S 表示产生汇编程序文件后停止编译,产生的汇编语言文件拓展名为.s

# gcc -S -o hello.s hello.i

打开hello.s会看到汇编代码,它只包含将本程序代码转成的汇编码,不包含被引用的库文件的汇编码,因为头文件里面只有被调用库函数的函数接口,并没有函数的实现代码。

第三步:将汇编语言转换成二进制机器码(ELF OBJ文件)

-c 表示取消连接步骤,即编译源码,并在最后生成obj(.o)文件

# gcc -c -o hello.o hello.s

查看hello.o的文件类型

# file hello.o

查看hello.o的文件内容

# hd hello.o

同样,obj文件也只包含本程序代码的机器码,不包含被引用的库文件的机器码。

第四步:链接(link)

链接是将本程序的机器码和被调用的库函数的机器码进行连接,形成完整的可执行程序。本程序和库函数的机器码进行连接有两种方式,动态和静态,默认是动态的连接方式,即生成的本程序并不包含库函数的机器码,只是含有指向库函数机器码的地址;静态的连接方式则是将库函数的机器码包含到生成的可执行文件中。

默认的动态连接方式生成可执行文件hello

# gcc -o hello hello.o

静态连接方式生成可执行文件hello_s

# gcc -static -o hello_s hello.o

执行可执行程序

# ./hello

# ./hello_s

1. 可用-L dir/path/ 指定搜索机器码库文件的位置

2. 可用-lname指示编译器在链接时装载名为libname.a的函数库

3. 可用 -g 在目标文件中嵌入调试信息,以便gdb之类的调试程序调试

4. 可用 -D 进行宏定义

hello.o文件只有2K左右,动态链接的可执行文件hello有16K左右,静态链接的可执行文件hello_s有800K左右。

动态链接的可执行文件hello比hello.o多出的内容是一些头信息、元数据、段信息、符号表、重定位信息;静态链接的可执行程序hello_s比hello多出的是库函数的二进制代码。

静态库和动态库

库是指可供其它程序调用的函数和数据,动态链接时使用动态格式的库,静态链接时使用静态格式的库。

默认的链接对库函数的调用是用动态加载的方式:-dynamic-linker /lib64/ld-linux-x86-64.so.2

静态库(.a):程序在链接时把库的代码拷贝到可执行文件中,程序运行时不再需要静态库。静态库比较占用磁盘空间,也比较占内存,因为每个程序都包含了一份静态库。

​ 动态库(.so或.sa):程序在运行时去链接库的代码,多个程序共享库的代码,这样就减少了程序的体积,也减少了内存的占用。

静态库的命名规则:

◆ Linux : libxxx.a

​ lib : 前缀(固定)

​ xxx : 库的名字,自己起 .

​ a : 后缀(固定)

◆ Windows : libxxx.lib

静态库制作和使用方法:

# 为了生成静态库.a文件,我们需要先生成.o文件
gcc -c add.c div.c mult.c sub.c
# ar是gun归档工具,rcs表示replace and create,如果libcalc之前存在,将创建新的libcalc.a并将其替换
ar rcs libcalc.a add.o sub.o mult.o div.o
# 将库放到指定位置
cp libcalc.a ../library/lib/
cp head.h ../library/include/
cp add.c div.c mult.c sub.c ../library/src/
# 使用库
gcc main.c -o app -I./include/ -L./lib -lcalc

◆ 动态库命名规则:

​ Linux : libxxx.so

​ lib : 前缀(固定)

​ xxx : 库的名字,自己起 .

​ so : 后缀(固定)

◆ Windows : libxxx.dll

动态库制作和使用方法:

# 先生成与位置无关的.o文件
gcc -c -fpic add.c div.c mult.c sub.c
# 打包生成动态库
gcc -shared add.o sub.o mult.o div.o -o libcalc.so
# 放到指定位置
cp libcalc.so ../library/lib/
cp head.h ../library/include/
cp add.c div.c mult.c sub.c ../library/src/
# 使用动态库
gcc main.c -o app -I./include/ -L./lib/ -lcalc
# 查看动态库依赖
ldd app
# 如果有找不到的动态库,可通过以下四种方法解决:
# 1. #拷贝.so文件到系统共享库,一般指/usr/lib或者/lib/
sudo cp ./lib/libcalc.so /usr/lib/
# 2. 通过临时环境变量添加动态库的搜索位置
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/deroy/library/lib
echo $LD_LIBRARY_PATH
ldd app
# 3. 将环境变量写入到~/.bashrc
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/deroy/library/lib
source .bashrc
# 4. 将环境变量写入到系统环境变量/etc/profile,需要root权限
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/deroy/library/lib
source /etc/profile

参考资料

https://blog.csdn.net/qq_44519484/article/details/118342896

https://blog.csdn.net/czg13548930186/article/details/78331692

Linux下详解gcc编译过程(含代码示例)&& gcc使用教程_gcc编译命令-CSDN博客

Linux系统下的GCC编译过程、使用命令详解(多文件编译、动态库、静态库)-CSDN博客

unix中系统头文件的位置(sys/socket.h)

相关文章:

Linux Ubuntu 24.04 C语言gcc编译过程详解

下面是Hello World程序源代码文件hello.c的内容&#xff0c;我们将以它为例来说明源文件到可执行文件的形成过程&#xff0c;主要分4步&#xff1a;预处理、汇编、机器码、链接。 #include <stdio.h> int main () {printf ( "hello, world \n " );return 0; }…...

Python自动化办公篇—pandas操作Excel:读取+查看+选择+清洗+排序+筛选+函数+写入

目录 专栏导读库的介绍库的安装1、读取数据2、查看数据3、选择数据4、数据清洗5、数据排序6、数据筛选7、数据操作8、数据写入总结 专栏导读 文章名称链接Python自动化办公—pyautogui图像定位\点击功能,实现自动截取当前屏幕并检索点击(可制作为游戏点击脚本)点我进行跳转Pyt…...

数据库大作业——音乐平台数据库管理系统

W...Y的主页&#x1f60a; 代码仓库分享&#x1f495; 《数据库系统》课程设计 &#xff1a;流行音乐管理平台数据库系统&#xff08;本数据库大作业使用软件sql server、dreamweaver、power designer&#xff09; 目录 系统需求设计 数据库概念结构设计 实体分析 属性分…...

【DBA早下班系列】—— 并行SQL/慢SQL 问题该如何高效收集诊断信息

1. 前言 OceanBase论坛问答区或者提交工单支持的时候大部分时间都浪费在了诊断信息的获取交互上&#xff0c;今天我就其中大家比较头疼的SQL问题&#xff0c;给大家讲解一下如何一键收集并行SQL/慢SQL所需要的诊断信息&#xff0c;减少沟通成本&#xff0c;让大家早下班。 2. …...

用python实现多文件多文本替换功能

用python实现多文件多文本替换功能 今天修改单位项目代码时由于改变了一个数据结构名称&#xff0c;结果有几十个文件都要修改&#xff0c;一个个改实在太麻烦&#xff0c;又没有搜到比较靠谱的工具软件&#xff0c;于是干脆用python手撸了一个小工具&#xff0c;发现python在…...

【DevOps】深入探索Ubuntu操作系统:全面了解

引言 在开源软件的世界里&#xff0c;Ubuntu是一个闪耀的明星。它不仅是一个操作系统&#xff0c;更是一种社区精神、一种共享和协作的文化。Ubuntu操作系统基于强大的Linux内核&#xff0c;由世界各地的开发者共同维护和改进。在这篇博文中&#xff0c;我们将深入探索Ubuntu操…...

【Linux】—MySQL安装

文章目录 前言一、下载官方MySQL包二、下载完成后&#xff0c;通过xftp6上传到Linux服务器上三、解压MySQL安装包四、在安装目录下执行rpm安装&#xff0c;请按顺序依次执行。五、配置MySQL六、启动MySQL数据库七、退出&#xff0c;重新登录数据库 前言 本文主要介绍在Linux环境…...

【vue】form表单提交validate验证不进valid原因

目录 1. 原因 1. 原因 1.<el-form>是否写了ref“form”。2.是否有其它标签写了ref“form”。3.<el-form>中要写成:model&#xff0c;不能使用v-model。4.自定义的validate要各个路径均能返回callback()。 const validatePass (rule, value, callback) > {if (…...

如何用 Google Chrome 浏览器浏览经过 XSLT 渲染的 XML 文件

对于经过XSLT渲染的XML文件&#xff0c;本来&#xff0c;可以直接用 IE (Internet Explorer) 打开&#xff0c;就能看到渲染之后的样子&#xff0c;很方便。但是后来&#xff0c;微软把 IE 换成了 Microsoft Edge&#xff0c;按理说这是比 IE 更先进的浏览器&#xff0c;可是偏…...

Python学习笔记12:进阶篇(二),类的继承与组合

类的继承 我们在编写一系列的类的时候&#xff0c;会发现这些类很相似&#xff0c;但是又有各自的特点和行为。在编写这些类的时候&#xff0c;我们可以把相同的部分抽象成一个基类&#xff0c;然后根据其他不同的特点和行为&#xff0c;抽象出子类&#xff0c;继承这个基类。…...

npm install cnpm -g 报错4048

npm install cnpm -g 报错4048 设置淘宝镜像&#xff1a; 报错如下&#xff1a; 其他博主提供的方法都尝试了&#xff0c;比如管理员权限打开终端&#xff0c;删除.npmrc文件&#xff0c;清除缓存npm cache clean -f等都试了无效&#xff0c;最后怀疑是npm和cnpm版本不对应&…...

本地快速部署 SuperSonic

本地快速部署 SuperSonic 0. 引言1. 本地快速部署 supersonic2. 访问 supersonic3. 支持的数据库4. github 地址 0. 引言 SuperSonic融合Chat BI&#xff08;powered by LLM&#xff09;和Headless BI&#xff08;powered by 语义层&#xff09;打造新一代的BI平台。这种融合确…...

如何给vue开发的网站做seo?

最近公司有个需求&#xff0c;需要给公司的官网sqlynx做seo&#xff0c;但因为各种历史原因吧&#xff0c;原来的网站是用vue开发的。没办法&#xff0c;只能尝试尽量做一些seo&#xff0c;让网站能更好一些。 目录 1. 服务器端渲染&#xff08;SSR&#xff09; 2. 预渲染&am…...

算法训练营第六十天(延长12天添加图论) | LeetCode 647 回文子串、LeetCode 516 最长回文子序列

LeetCode 67 回文子串 思路很简单&#xff0c;每一个dp[i]等于dp[i-1]加上当前字符向前直到0各个长度字符串回文串个数即可 代码如下&#xff1a; class Solution {public boolean isValid(String s) {int l 0, r s.length() - 1;while (l < r) {if (s.charAt(l) ! s.ch…...

TikTok账号养号的流程分享

对于很多刚开始运营TikTok的新手小白来说&#xff0c;都会有一个同样的疑问&#xff0c;那就是&#xff1a;TikTok到底需不需要养号&#xff1f;这里明确告诉大家是需要养号的&#xff0c;今天就把我自己实操过的养号经验和策略总结出来&#xff0c;分享给大家。 一、什么是Ti…...

C++初学者指南第一步---6.枚举和枚举类

C初学者指南第一步—6.枚举和枚举类 文章目录 C初学者指南第一步---6.枚举和枚举类1.作用域的枚举(enum class类型&#xff09;&#xff08;C11&#xff09;2.无作用域的枚举(enum类型)3.枚举类的基础类型4.自定义枚举类映射5.和基础类型的互相转换 1.作用域的枚举(enum class类…...

【js判断机型】

var isIOS /(iPhone|iPad|iPod)/i.test(navigator.userAgent) var isiPad navigator.userAgent.match(/(iPad)/) || (navigator.platform ‘MacIntel’ && navigator.maxTouchPoints > 1) 上面这个不行的话&#xff0c;再试下这个 var isiPad (navigator.userAg…...

google chrome浏览器安装crx插件Jam

先上一张图&#xff1a; Jam是bug报告生成插件 1、在地址栏中输入chrome://extensions/&#xff0c;然后回车。 2、将下载好的crx插件&#xff0c;直接拖到里面就可以完成安装工作了。 3、测试了一下jam插件&#xff0c;发现直接没有响应。 4、点击【移除】直接可以删除插件…...

【Java面试】二十、JVM篇(上):JVM结构

文章目录 1、JVM2、程序计数器3、堆4、栈4.1 垃圾回收是否涉及栈内存4.2 栈内存分配越大越好吗4.3 方法内的局部变量是否线程安全吗4.4 栈内存溢出的情况4.5 堆和栈的区别是什么 5、方法区5.1 常量池5.2 运行时常量池 6、直接内存 1、JVM Java源码编译成class字节码后&#xf…...

【Python教程】压缩PDF文件大小

压缩 PDF 文件能有效减小文件大小并提高文件传输的效率&#xff0c;同时还能节省计算机存储空间。除了使用一些专业工具对PDF文件进行压缩&#xff0c;我们还可以通过 Python 来执行该操作&#xff0c;实现自动化、批量处理PDF文件。 本文将分享一个简单有效的使用 Python 压缩…...

实战演练:基于快马平台快速开发一个可动态切换主题色的网站Demo

今天想和大家分享一个非常实用的前端小项目——如何快速开发一个能动态切换主题色的网站Demo。这个功能在实际项目中特别常见&#xff0c;比如我们常见的深色模式切换、企业官网的主题定制等。下面我就用InsCode(快马)平台来演示整个实现过程。 项目结构设计 首先我们需要规划…...

百川2-13B-4bits模型微调指南:提升OpenClaw任务执行准确率

百川2-13B-4bits模型微调指南&#xff1a;提升OpenClaw任务执行准确率 1. 为什么需要微调百川模型&#xff1f; 去年夏天&#xff0c;当我第一次用OpenClaw自动化整理电脑上的数千份文档时&#xff0c;遇到了一个尴尬的问题——AI经常把技术文档和私人照片混在一起归类。这让…...

革新性硬件控制工具:OmenSuperHub实现游戏本性能优化与完全掌控

革新性硬件控制工具&#xff1a;OmenSuperHub实现游戏本性能优化与完全掌控 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub OmenSuperHub是一款专为惠普暗影精灵系列游戏本设计的开源硬件控制工具&#xff0c;提供完全离线的…...

Qwen2.5-VL半监督学习效果展示:有限标注下的性能提升

Qwen2.5-VL半监督学习效果展示&#xff1a;有限标注下的性能提升 1. 引言 在AI视觉领域&#xff0c;标注数据一直是制约模型性能的关键因素。传统监督学习需要大量人工标注&#xff0c;成本高、周期长&#xff0c;让很多企业和研究者望而却步。但今天&#xff0c;随着半监督学…...

OpenClaw+GLM-4.7-Flash低成本方案:自建模型替代SaaS API

OpenClawGLM-4.7-Flash低成本方案&#xff1a;自建模型替代SaaS API 1. 为什么选择自建模型替代商业API 去年夏天&#xff0c;当我第一次尝试用OpenClaw自动化处理公司周报时&#xff0c;被OpenAI的API账单吓了一跳——简单的文档整理和摘要生成&#xff0c;一个月竟然消耗了…...

[技术突破]obs-multi-rtmp:解决多平台直播资源浪费问题的高效分发方案

[技术突破]obs-multi-rtmp&#xff1a;解决多平台直播资源浪费问题的高效分发方案 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 行业痛点诊断 直播行业正面临多平台分发的严峻挑战&a…...

别再死记ResNet结构了!用PyTorch手搓一个ResNet-50,从零理解残差连接

从零构建ResNet-50&#xff1a;用PyTorch拆解残差网络的秘密 深度学习领域最令人着迷的突破之一&#xff0c;莫过于残差网络&#xff08;ResNet&#xff09;的诞生。2015年&#xff0c;何恺明团队提出的这一架构不仅横扫ImageNet竞赛&#xff0c;更彻底改变了我们对深度神经网络…...

ESFT-gate-summary-lite:AI快速提炼文本关键信息

ESFT-gate-summary-lite&#xff1a;AI快速提炼文本关键信息 【免费下载链接】ESFT-gate-summary-lite ESFT-gate-summary-lite模型&#xff0c;基于DeepSeek-ai的开源项目&#xff0c;专注于提升基础模型摘要能力。源自ESFT-vanilla-lite&#xff0c;强化文本摘要&#xff0c;…...

实战复盘:我是如何用Turbo Intruder的race.py脚本,5分钟挖到一个高并发订单漏洞的

高并发漏洞狩猎实录&#xff1a;从Turbo Intruder脚本调优到电商系统攻防实战 去年在一次众测项目中&#xff0c;我偶然发现某电商平台的积分兑换系统存在并发处理缺陷。这个漏洞最终被评级为高危&#xff0c;而整个挖掘过程只用了不到5分钟——关键就在于对Turbo Intruder的ra…...

AI教材生成强力工具!低查重保障,让教材编写事半功倍!

梳理教材知识点确实是一项“精细活”&#xff0c;最大的挑战在于平衡和衔接知识之间的关系。如果不小心&#xff0c;很可能会遗漏一些核心知识点&#xff0c;或者在难度的把控上出现问题——小学教材常常写得过于复杂&#xff0c;让学生难以理解&#xff1b;而高中教材又可能显…...