从零开始学Linux之gcc命令

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

编译型语言:要求必须提前将所有源代码一次性转换成二进制指令,也就是生成一个可执行程序,例如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库的缩写

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解析电子名片二维码生成:便捷、灵活、个性化

在当今信息爆炸的时代,名片已经成为商务社交不可或缺的工具之一。然而,随着技术的不断发展,传统的纸质名片已经逐渐被电子名片生成二维码所取代。电子名片二维码不仅具备了传统名片的基本信息展示功能,更融合了数字化优势&#xf…

记一次java项目本地正常执行,打完包之后执行发现没有对应的类或配置的问题

1、起因 线上有个spark的任务出了问题(该任务是通过sparkstreaming读取kafka中的数据,处理完之后推到es中),问题出在kafka中数据是有更新的,但是es中的对应索引中的数据却只更新到月初,因此我需要排查处理…

IDEA 取消参数名称提示、IDEA如何去掉变量类型提醒

一、IDEA 取消参数名称显示 取消显示形参名提示 例如这样的提示信息 二、解决方法 1、File—>Setting–>Editor—>Inlay Hints—>Java 去掉 Show Parameter hints for 前面的勾即可,然后Apply—>Ok 2、右键Disable Hints

爬虫学习笔记-Cookie登录古诗文网

1.导包请求 import requests 2.获取古诗文网登录接口 url https://so.gushiwen.cn/user/login.aspxfromhttp%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx # 请求头 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like …

自定义注解实现记录日志功能(注解支持SpEL表达式)

一、首先创建个接口类Log import java.lang.annotation.*;/*** description: 自定义操作日志记录注解* author xizc**/ Target({ ElementType.PARAMETER, ElementType.TYPE, ElementType.METHOD }) Retention(RetentionPolicy.RUNTIME) Inherited Documented public interface …

JUnit

前言:自动化就是selenium脚本来实现的,JUnit是java的单元测试工具,只不过我们在实现自动化的时候需要借助一下JUnit库里面提供的一些方法。 1、Test Test :表示方法是测试方法,执行当前这个类的时候,会自动…

Unity之做一个最简单的FPS游戏demo

目录 😋FPS游戏Demo 💤1.新建FPS模板项目 ⚒️2.装备枪 💣3.设置射击功能 📺4.制造一个子弹预制体 🎮5.发射子弹 说起来小编学Unity差不多一个月了,都是利用上班摸鱼时间学的(doge.jpg&…

java+springboot校园体育场地预约预订使用系统vue+ssm

研究内容和研究方法 1.研究内容 网站主要包括管理员和用户两个部分,用户可以登录与注册自己的基本信息、查询哪些场地可以使用、提前预约场地、取消预约的场地、使用完场地后进行缴费。管理员可以审批用户的注册信息、对用户信息进行增删改查、查询场地的使用情况、…

【C++干货基地】C++引用与指针的区别:深入理解两者特性及选择正确应用场景

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 哈喽各位铁汁们好啊,我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发,不知道各位的…

秋招面试—JS篇

2024 JavaScript面试题 1.new 操作符的工作原理 ①.创建一个新的空对象 ②.将这个对象的原型设置为函数的 prototype 对象 ③.让函数的this指向该对象,为函数添加属性和方法 ④.最后返回这个对象 2.什么是DOM,什么是BOM? DOM:文档对象…

AI日报:谷歌的“双子时代”:将第二代人工智能嵌入其所做的一切

谷歌强大的大型多模式模式Gemini正在进军搜索、广告、云、Bard等领域。Bard的付费订阅即将到来吗? 文章目录 一览Bard订阅即将到来?一代人工智能进入谷歌广告YouTube正在崛起收入上升但股价下跌 一览 谷歌首席执行官、母公司Alphabet的桑达尔皮查伊表示&…

Kotlin 协程:用源码来理解 ‘viewModelScope‘

Kotlin 协程:用源码来理解 ‘viewModelScope’ Kotlin 协程是 Kotlin 语言的一大特色,它让异步编程变得更简单。在 Android 开发中,我们经常需要在后台线程执行耗时操作,例如网络请求或数据库查询,然后在主线程更新 UI…

VBoxManage 命令行使用

VBoxManage: 序号命令作用1VBoxManage list vms# 查看当前所有虚拟机2VBoxManage list runningvms # 查看当前正在运行的虚拟机3VBoxManage startvm 虚拟机名 --type gui # 启动虚拟机4VBoxManage startvm 虚拟机名 --type headless# 无前端图形界面方式启动虚拟机…

Elasticsearch:构建自定义分析器指南

在本博客中,我们将介绍不同的内置字符过滤器、分词器和分词过滤器,以及如何创建适合我们需求的自定义分析器。更多关于分析器的知识,请详细阅读文章: 开始使用 Elasticsearch (3) Elasticsearch: analyzer…

Debezium发布历史101

原文地址: https://debezium.io/blog/2021/01/07/debezium-1-4-final-released/ 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. Debezium 1.4.0.Final 发布 2021 年 1 月 7 日 作者: 克里…

C#中的WebApi响应Accept头,自动返回xml或者json

Global.asax.cs中的Application_Start方法添加 GlobalConfiguration.Configuration.Formatters.Clear(); GlobalConfiguration.Configuration.Formatters.Add(new XmlMediaTypeFormatter()); GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter())…

工作七年,对消息推送使用的一些经验和总结

前言:不管是APP还是WEB端都离不开消息推送,尤其是APP端,push消息,小信箱消息;WEB端的代办消息等。因在项目中多次使用消息推送且也是很多项目必不可少的组成部分,故此总结下供自己参考。 一、什么是消息推…

Vue.js 中子组件向父组件传值的方法

Vue.js 是一款流行的 JavaScript 前端框架,它提供了一套完整的工具和 API,使得开发者可以更加高效地构建交互式的 Web 应用程序。其中,组件化是 Vue.js 的一个核心概念,通过组件化可以将一个复杂的应用程序拆分成多个独立的部分&a…

3D应用开发平台HOOPS Platforms优化制造流程和数字化转型

Tech Soft 3D公司的HOOPS Platform (包括HOOPS Native Platform 和HOOPS Web Platform),是一种用于开发顶级3D软件的集成技术。具有高性能3D图形,准确,快速的CAD数据转换,3D数据发布以及与流行的建模内核的…

iOS_Xcode_LLDB调试常用命令

文章目录 结构常用命令:1、流程控制:2、常用命令3、进程信息:4、寄存器:register5、镜像:image6、内存:memory7、符号断点:breakpoint8、内存断点:watchpoint9、Tips: 结…