从零开始学Linux之gcc命令

news2024/11/27 12:38:17

首先我们需要知道有两种编程语言

编译型语言:要求必须提前将所有源代码一次性转换成二进制指令,也就是生成一个可执行程序,例如C、C++、go语言、汇编语言等,使用的转换工具称为编译器。

解释型语言:一边执行一边转换,需要哪些源代码就转换哪些源代码,不会生成可执行程序,相当于翻译一句,然后执行一句,比如 Python、Java、PHP、Shell、Ruby、MATLAB 等,使用的转换工具称为解释器。

c语言是编译型语言,所以源代码需要经过一系列步骤转换成可执行程序才能执行,在Linux系统中就使用gcc命令来实现转换

在Linux系统中有以下后缀表示的文件类型

.c  源代码文件。

.i  已经预处理的C源代码文件。

.s  汇编语言源代码文件。

.o  编译后的目标文件。

.ii 已经预处理的C++源代码文件。

.h  程序所包含的头文件。

.a  静态链接库文件,格式为lib库名.a

.so 动态链接库文件,格式为lib库名.so,一定是以lib开头

源代码转换成可执行程序通常需要以下几步

预处理:将源程序.c预处理,生成.i文件。

编译:将预处理后的.i文件编译成为汇编语言,生成 .s文件。

汇编:将汇编语言文件经过汇编,生成目标文件.o文件。

链接:将.o目标文件链接起来生成一个可执行程序文件,可分为静态链接和动态链接

静态链接:链接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,一旦链接成功就可独立运行,生成的可执行文件不再需要任何静态库文件的支持就可以独立运行。缺点是如果所使用的静态库发生更新改变,就需要必须重新编译。

动态链接:不会直接将该函数的代码拷贝到文件中,而是将函数的位置信息记录到文件中,然后生成可执行文件。这样生成的可执行文件是无法独立运行的,但是可执行文件中记录了所需功能函数的位置信息,所以也可以成功运行。如果该动态链接库不存在了该可执行文件就无法运行。动态库的代码只有程序执行的时候才会加入到可执行文件,优点就是用户更新了动态库不需要重新编译,缺点是可移植性差,无法独立运行,必须借助相应的库文件。

gcc命令选项

-E :预处理

-S :预编译

-c :汇编

-o :指定文件名

-Idir:将dir加入到头文件的搜索目录中,默认的搜索目录是/usr/include,如果编译的时候需要的头文件不在/usr/include中,就需要使用-Idir添加搜索目录

-Ldir:将dir加入到库文件的搜索目录中,默认的搜索目录是/usr/lib,如果链接的时候需要的库函数文件不在/usr/lib中,就需要使用-Ldir添加搜索目录

-l:指定库函数的名字

各步骤使用的命令,源文件为test.c

1、预处理:gcc -E test.c -o test.i只执行预处理操作得到预编译文件。

2、编译:gcc -S test.i -o test.s将预编译文件编译输出汇编文件。

3、汇编,gcc -c test.s -o test.o

4、链接,将目标文件与所需的附加目标文件(静态链接库和动态链接库、C标准输入输出库)连接起来,最终生成可执行文件test:gcc test.o -o test

通常可以只执行以下两步:

.c文件执行gcc -c编译成.o目标文件,然后执行gcc -o链接成可执行程序

编译命令:gcc -c 文件名.c

链接命令:gcc -o 文件名.o 指定可执行文件名

也可以编译和链接一起:gcc -o 文件名.c 指定可执行文件名

执行命令:./指定可执行文件名

例如hello.c文件

gcc -c hello.c         //将hello.c编译成hello.o目标文件

gcc hello -o hello.o        //将hello.o目标文件链接成hello可执行程序

./hello.out              //然后运行该可执行程序

-o表示指定可执行文件的名字,如果只执行gcc 文件名.c,将会默认生成a.out可执行文件

如果hello.c文件使用了自己编写的头文件,且该头文件不在/usr/include默认搜索路径中,而是在/usr/local/pow/include,还使用了自己编写的函数库,且该函数不在/usr/lib默认搜索路径中,而是在/usr/local/pow/lib,该函数库为libhello.so,就需要使用-I选项和-L选项指定头文件和库函数的位置,用-l指定是哪个库函数,这里要注意使用-l选项时库函数前面的lib和.so要去掉,例如指定libhello.so库函数就是-lhello

gcc -c hello.c -I/usr/local/pow/include        

//编译,增加头文件搜索目录/usr/local/pow/include

gcc -o hello hello.o -L/usr/local/pow/lib -lhello  

//链接,增加库函数文件搜索目录/usr/local/pow/lib和指定库函数

也可以直接-I,-L,-l三个选项一步到位

gcc -o hello hello.o -L/usr/local/pow/lib -I/usr/local/pow/include -lhello    

如果头文件和库函数名都在默认搜索路径中,则只需要指定库函数名,如源代码使用了内置的数学函数库math需要使用-lm链接,m是math库的缩写

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

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

相关文章

[NOIP2011 提高组] 聪明的质监员

[NOIP2011 提高组] 聪明的质监员 题目描述 小T 是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有 n n n 个矿石,从 1 1 1 到 n n n 逐一编号,每个矿石都有自己的重量 w i w_i wi​ 以及价值 v i v_i vi​ 。检验矿产的流程…

muduo库的模拟实现——工具部分

文章目录 一、Buffer模块1.为什么需要Buffer缓冲区2.Buffer模块的设计3.Buffer模块的实现4.Buffer缓冲区的其它设计方案 二、Socket模块1.Socket模块的设计2.Socket代码实现 三、Acceptor模块1.Acceptor模块的设计与实现2.Acceptor模块完整代码实现 四、定时器模块1.时间轮的思…

opencv——将2张图片合并

效果演示: 带有绿幕的图片的狮子提取出来,放到另一种风景图片里! 1. 首先我们要先口出绿色绿幕,比如: 这里将绿色绿色绿幕先转为HSV,通过修改颜色的明暗度,抠出狮子的轮廓。 代码 : import cv2 as cv import numpy as np import matplotlib.pyplot as plt def showI…

正弦波拟合

正弦波拟合是一种常见的数学方法,用于确定最佳匹配给定数据集的正弦波形。这可以用于各种应用,如信号处理、周期性数据分析等。以下举例展示如何进行正弦波拟合。 步骤与方法 收集数据:首先,你需要收集或生成一组数据&#xff0…

食品信息管理系统java项目ssm项目springboot项目

食品信息管理系统java项目ssm项目springboot项目,增删改查均已实现,有批量删除 前端技术: JavaScript,Layui,Html5 后端技术: Java,MySql,Spring,Spring Mvc,SpringBoot&#xff0…

【代码随想录20】669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

目录 669.修剪二叉搜索树题目描述参考代码 108.将有序数组转换为二叉搜索树题目介绍参考代码 538.把二叉搜索树转换为累加树题目描述参考代码 669.修剪二叉搜索树 题目描述 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树…

2024.1.28 GNSS 学习笔记

1.基于 地球自转改正卫地距 以及 伪距码偏差 重构定位方程: 先验残差计算公式如下所示: 2.观测值如何定权?权重如何确定? 每个卫星的轨钟精度以及电离层模型修正后的误差都有差异,所以我们不能简单的将各个观测值等权…

2024.2.1日总结

web的运行原理: 用户通过浏览器发送HTTP请求到服务器(网页操作)。web服务器接收到用户特定的HTTP请求,由web服务器请求信息移交给在web服务器中部署的javaweb应用程序(Java程序)。启动javaweb应用程序执行…

(黑马出品_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

(黑马出品_01)SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术栈导学 1.认识微服务1.1.学习目标1.2.单体架构1.3.分布式架构1.4.微服务1.5.SpringCloud1.6.总结 2.服务拆分和远程调用2.1.服务拆分原则2.2.服务拆分示…

main函数、_tmain函数和wmain函数的区别

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 今天碰到一个问题,算是彻底搞明白了main函数、_tmain函数和wmain函数的区别。就是使用vs2015新建一个控制台工程,如果入口函数是设…

Maya------布尔 圆形圆角组件

17. maya常用命令7.布尔 圆形圆角组件_哔哩哔哩_bilibili 选中一个模型,再按shift加选另外一个模型 圆形圆角命令

STM32——SPI

STM32——SPI 1.SPI介绍 SPI是什么? SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚&#…

关于系统报错找不到X3DAudio1_7.dll怎么修复?总共有五个常见方案供你选择

通常情况下,当电脑尝试运行某些应用程序或游戏时,可能会遭遇“找不到x3daudio1_7.dll无法继续执行”的错误信息,这通常表明系统中缺少某个重要文件。为了理解这一问题,并寻找有效的解决方案,让我们先探讨为什么会发生这…

C++类和对象之进击篇

目录 1.类的6个默认成员函数2.构造函数2.1概念2.2特性 3.析构函数3.1概念3.2特性 4.拷贝构造函数4.1 概念4.2特征 5.赋值运算符重载5.1运算符重载5.2赋值运算符重载5.3前置和后置重载 6.日期类的实现7.const成员8.取地址及const取地址操作符重载 1.类的6个默认成员函数 如果一…

Versal Adaptive SoC Boards, Kits, and Modules

Versal™ AI Edge Series VEK280 Evaluation Kit https://www.xilinx.com/products/boards-and-kits/vek280.html#whatsInside The VEK280 Evaluation Kit, equipped with the AMD Versal™ AI Edge VE2802 adaptive SoC, offers AIE-ML and DSP hardware acceleration engin…

【HarmonyOS 4.0 应用开发实战】TypeScript入门之元组详讲

个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…

UE5.1_常用节点说明(经常忘记怎么用?)(常改)

UE5.1_常用节点说明(经常忘记怎么用?)(常改) 1. Gate——门节点。只有当门是Open状态才会执行Exit后面的代码。 Open开门;Close关门;Toggle开门和关门交替。 2. 关于控制ArmLength即控制相机前…

AD24-层叠的定义与添加(正片层与负片层)

一、叠层添加 1、设计-层叠管理器,进入层叠界面 2、一般添加红色框这两个 3、左侧绿色框勾上,表示每次添加两个层,去掉即添加一个层 4、名称修改 5、完成查看 二、正片层与负片层 1、定义 2、正片层(所见即所得,看到…

美睫师睫毛嫁接零基础学习,日式美睫与开花嫁接实战教学

一、教程描述 大家都说女人的钱好挣,这是因为每个女人在每年,都要花很多钱来打扮自己。本套教程是关于日式美睫和开花嫁接的,从零基础学习到店铺经营都有涉及,就做美睫和睫毛嫁接这两项业务,月收入万元以上应该问题不…

51单片机编程应用(C语言):独立按键

目录 1.独立按键介绍 2.独立按键控制LED亮灭 1.1按下时LED亮,松手LED灭(按一次执行亮灭) 1.2首先按下时无操作,松手时LED亮(再按下无操作,所以LED亮),松手LED灭(松手时…