从零开始学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库的缩写

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

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

相关文章

【2024全网最详细】Google 搜索命令终极指南

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 你是否尝试过使用 Google 搜索作为免费的 SEO …

结构体的学习

结构体与共用体,枚举 1.数据类型复习: 2结构体. eg;统计全校同学信息 需要记录的点--- 姓名,班级,性别,成绩,年龄 统计名字:char s[ ] [ 100 ] { "Tmo" } …

VRRP负载平衡

1.构图 2.实验 2.1如图提示配置pc1-pc4 掩码:255.255.255.0网关均设置为192.168.1(\2).254 2.2配置sw1-sw2 [sw1]port-group 1 //创建接口组,组号是1[sw1-port-group 1]group-member gigabitethernet 0/0/1 to gigabitethernet 0/0/3 //添加组成员,从…

springboot142新冠病毒密接者跟踪系统

新冠病毒密接者跟踪系统设计与实现 摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲&#xff…

有源滤波装置在电能质量生物制药行业中的应用

上海安科瑞电气股份有限公司 胡冠楠 咨询家:“Acrelhgn”,了解更多产品资讯 摘要:随着电子设备大量的使用,非线性负荷越来越多,企业电力网的谐波污染问题也越来越严重,由于谐波的不良作用恶化电能质量&…

【鸿蒙】大模型对话应用(三):跨Ability跳转页面

Demo介绍 本demo对接阿里云和百度的大模型API,实现一个简单的对话应用。 DecEco Studio版本:DevEco Studio 3.1.1 Release HarmonyOS SDK版本:API9 关键点:ArkTS、ArkUI、UIAbility、网络http请求、列表布局、层叠布局 页面跳…

C#用正则表达式判断字符串是否纯数字vs用Char.IsDigit 方法遍历字符数组是否纯数字

目录 一、使用的方法 1.正则表达式 2.Char.IsDigit 方法 二、源码 1.源代码 2.生成效果 一、使用的方法 1.正则表达式 在程序运行过程中,经常需要用户输入数字信息,如输入员工年龄、工资等。使用正则表达式Regex类的IsMatch方法,可以有…

产业热点 | 从 Vision Pro 发售,洞见空间计算时代新机遇

*图源:Apple 官网 近日首批 Vision Pro 启动预约发售,短短一周就预估售出 20 万台,如今正式发售在即,再度受到各界的热切关注。 *图源:Apple 官网 同样作为空间计算赛道企业,ALVA Systems 在过去十余年始…

ubuntu20配置mysql8

首先更新软件包索引运行 sudo apt update命令。然后运行 sudo apt install mysql-server安装MySQL服务器。 安装完成后,MySQL服务将作为systemd服务自动启动。你可以运行 sudo systemctl status mysql命令验证MySQL服务器是否正在运行。 连接MySQL 当MySQL安装…

【免费分享】数据可视化-银行动态实时大屏监管系统,含源码

一、动态效果展示 1. 动态实时更新数据效果图 ​ 2. 鼠标右键切换主题 二、确定需求方案 1. 屏幕分辨率 这个案例的分辨率是16:9,最常用的的宽屏比。 根据电脑分辨率屏幕自适应显示,F11全屏查看; 2. 部署方式 B/S方式:支持…

SpringBoot+Redis如何实现用户输入错误密码后限制登录(含源码)

点击下载《SpringBootRedis如何实现用户输入错误密码后限制登录(含源码)》 1. 引言 在当今的网络环境中,保障用户账户的安全性是非常重要的。为了防止暴力破解和恶意攻击,我们需要在用户尝试登录失败一定次数后限制其登录。这不…

【开发实践】python使用 moviepy实现mp4转gif(含可视化界面)

一、分析介绍 MoviePy是一个用于视频编辑和处理的Python库。它提供了一种简单而直观的方式来创建、编辑和合成视频,同时也支持添加音频和图像。 以下是MoviePy的一些主要功能和用法示例: 创建视频剪辑: from moviepy.editor import VideoFi…

如何做好多平台内容营销?媒介盒子分享

随着社交媒体不断多元化,内容营销逐渐发展出了新趋势,那就是跨平台内容营销。互联网平台相对封闭,平台的运营偏好也会吸引不同社区的粉丝聚集,造就其不同的品牌人格,然后用户个体需求极其复杂,兴趣也在不断…

Arcgis10.3安装

所需软件地址 链接:https://pan.baidu.com/s/1aAykUDjkaXjdwFjDvAR83Q?pwdbs2i 提取码:bs2i 1、安装License Manager 点击License Manager.exe,默认下一步。 安装完,点击License Server Administrator,停止服务。…

滑动窗口入门(算法村第十六关青铜挑战)

窗口:窗口其实就是两个变量left和ight之间的元素,也可以理解为一个区间。窗口大小可能固定,也可能变化。滑动:窗口是移动的,事实上移动的仍然是left和ight两个变量,而不是序列中的元素。当变量移动的时&…

【Android 字节码插桩】Gradle插件基础 Transform API的使用

前言 啪~我给大家开个会(手机扔桌子上) 什么叫做 客户无感的数据脱敏!? 师爷给翻译翻译什么叫做客户无感的数据脱敏? 什么特么的叫做客户无感数据脱敏? 举个栗子~ 客户端Sdk新升级了一个版本,增…

Jmeter,如何从数组参数中取值

有个post请求,参数“equipment_ids”,是个数组,需求每次执行的时候,按顺序取equipment_ids中不同的值 要实现在 JMeter 中每次执行请求时按顺序取不同的 equipment_ids 中的值,你可以使用 Counter 元件来生成索引&…

Qt读写Execl:QXlsx库

Qt三方库开发技术:QXlsx介绍、编译和使用 我自己记录的实例代码:https://download.csdn.net/download/cao_jie_xin/88795216 目录 一、概述二、下载三、编译四、加载QXlsx静态库五、介绍一些常用的功能1、一些头文件和命名空间2、创建一个excel文件3、…

vue-cli脚手架的安装

vue-cli 1 什么是vue-cli Vue 提供了一个官方的 CLI,为单页面应用 (SPA) 快速搭建繁杂项目的脚手架。它为现代前端工作流提供了 batteries-included 的构建设置。只需要几分钟的时间就可以运行起来并带有热重载、保存时 lint 校验,以及生产环境可用的构…

在linux(centos)上运行C语言文件

📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 目录 1.下载gcc2.创建C语言…