Linux GCC常用命令

预处理,编译,汇编,链接 目录 前言 1.预处理: 宏替换: 头文件展开: 条件编译: 2.编译: 3.汇编: 4.链接: 前言 一个c/c++文件想要变成可执行文件要经过预处理生成预处理文件(.i文件),编译阶段对预处理文件进行编译生成汇编文件(.s文件),汇编阶段对汇编文件进行处理生成目标文件(.o文件),最后链接目标文件生成可执行程序。下面我将介绍在各个阶段对程序进行了哪些处理。 1.预处理: c/c++源文件中,以#开头的命令被称为预处理命令,如#include、#define、条件编译命令#if 阅读详情

1简介

2简单编译

2.1预处理

2.2编译为汇编代码(Compilation)

2.3汇编(Assembly)

2.4连接(Linking)

3多个程序文件的编译

4检错

5库文件连接

5.1编译成可执行文件

5.2链接

5.3强制链接时使用静态链接库

1简介

GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。另一方面,说到 GCC 对于操作系统平台及硬件平台支持,概括起来就是一句话:无所不在。

2简单编译

示例程序如下:

复制代码
//test.c
#include <stdio.h>
int main(void)
{
    printf("Hello World!\n");
    return 0;
}
复制代码

这个程序,一步到位的编译指令是:

gcc test.c -o test



实质上,上述编译过程是分为四个阶段进行的,即预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编 (Assembly)和连接(Linking)。

2.1预处理
gcc -E test.c -o test.i 或 gcc -E test.c

 

可以输出test.i文件中存放着test.c经预处理之后的代码。打开test.i文件,看一看,就明白了。后面那条指令,是直接在命令行窗口中输出预处理后的代码.

gcc的-E选项,可以让编译器在预处理后停止,并输出预处理结果。在本例中,预处理结果就是将stdio.h 文件中的内容插入到test.c中了。

2.2编译为汇编代码(Compilation)

预处理之后,可直接对生成的test.i文件编译,生成汇编代码:

gcc -S test.i -o test.s

gcc的-S选项,表示在程序编译期间,在生成汇编代码后,停止,-o输出汇编代码文件。

2.3汇编(Assembly)

对于上一小节中生成的汇编代码文件test.s,gas汇编器负责将其编译为目标文件,如下:

gcc -c test.s -o test.o
2.4连接(Linking)

gcc连接器是gas提供的,负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。

对于上一小节中生成的test.o,将其与C标准输入输出库进行连接,最终生成程序test

gcc test.o -o test

 

在命令行窗口中,执行./test, 让它说HelloWorld吧!

3多个程序文件的编译

通常整个程序是由多个源文件组成的,相应地也就形成了多个编译单元,使用GCC能够很好地管理这些编译单元。假设有一个由test1.c和 test2.c两个源文件组成的程序,为了对它们进行编译,并最终生成可执行程序test,可以使用下面这条命令:

gcc test1.c test2.c -o test

如果同时处理的文件不止一个,GCC仍然会按照预处理、编译和链接的过程依次进行。如果深究起来,上面这条命令大致相当于依次执行如下三条命令:

gcc -c test1.c -o test1.o
gcc -c test2.c -o test2.o
gcc test1.o test2.o -o test



4检错
gcc -pedantic illcode.c -o illcode

-pedantic编译选项并不能保证被编译程序与ANSI/ISO C标准的完全兼容,它仅仅只能用来帮助Linux程序员离这个目标越来越近。或者换句话说,-pedantic选项能够帮助程序员发现一些不符合 ANSI/ISO C标准的代码,但不是全部,事实上只有ANSI/ISO C语言标准中要求进行编译器诊断的那些情况,才有可能被GCC发现并提出警告。

除了-pedantic之外,GCC还有一些其它编译选项也能够产生有用的警告信息。这些选项大多以-W开头,其中最有价值的当数-Wall了,使用它能够使GCC产生尽可能多的警告信息。

gcc -Wall illcode.c -o illcode

GCC给出的警告信息虽然从严格意义上说不能算作错误,但却很可能成为错误的栖身之所。一个优秀的Linux程序员应该尽量避免产生警告信息,使自己的代码始终保持标准、健壮的特性。所以将警告信息当成编码错误来对待,是一种值得赞扬的行为!所以,在编译程序时带上-Werror选项,那么GCC会在所有产生警告的地方停止编译,迫使程序员对自己的代码进行修改,如下:

gcc -Werror test.c -o test

 

5库文件连接

开发软件时,完全不使用第三方函数库的情况是比较少见的,通常来讲都需要借助许多函数库的支持才能够完成相应的功能。从程序员的角度看,函数库实际上就是一些头文件(.h)和库文件(so、或lib、dll)的集合。。虽然Linux下的大多数函数都默认将头文件放到/usr/include/目录下,而库文件则放到/usr/lib/目录下;Windows所使用的库文件主要放在Visual Stido的目录下的include和lib,以及系统文件夹下。但也有的时候,我们要用的库不再这些目录下,所以GCC在编译时必须用自己的办法来查找所需要的头文件和库文件。

例如我们的程序test.c是在linux上使用c连接mysql,这个时候我们需要去mysql官网下载MySQL Connectors的C库,下载下来解压之后,有一个include文件夹,里面包含mysql connectors的头文件,还有一个lib文件夹,里面包含二进制so文件libmysqlclient.so

其中inclulde文件夹的路径是/usr/dev/mysql/include,lib文件夹是/usr/dev/mysql/lib

 

5.1编译成可执行文件

首先我们要进行编译test.c为目标文件,这个时候需要执行

gcc –c –I /usr/dev/mysql/include test.c –o test.o
5.2链接

最后我们把所有目标文件链接成可执行文件:

gcc –L /usr/dev/mysql/lib –lmysqlclient test.o –o test

Linux下的库文件分为两大类分别是动态链接库(通常以.so结尾)和静态链接库(通常以.a结尾),二者的区别仅在于程序执行时所需的代码是在运行时动态加载的,还是在编译时静态加载的。

5.3强制链接时使用静态链接库

默认情况下, GCC在链接时优先使用动态链接库,只有当动态链接库不存在时才考虑使用静态链接库,如果需要的话可以在编译时加上-static选项,强制使用静态链接库。

在/usr/dev/mysql/lib目录下有链接时所需要的库文件libmysqlclient.so和libmysqlclient.a,为了让GCC在链接时只用到静态链接库,可以使用下面的命令:

gcc –L /usr/dev/mysql/lib –static –lmysqlclient test.o –o test

 

静态库链接时搜索路径顺序:

1. ld会去找GCC命令中的参数-L
2. 再找gcc的环境变量LIBRARY_PATH
3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的

动态链接时、执行时搜索路径顺序:

1. 编译目标代码时指定的动态库搜索路径
2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径
3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径
4. 默认的动态库搜索路径/lib
5. 默认的动态库搜索路径/usr/lib

有关环境变量:
LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径
LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径


GCC命令与参数详解 使用 GCC 需要对编译的四个阶段(编译过程),以及编译的规则有一定的了解,熟悉使用 GCC 对于编写 Makefile 具有决定性的作用。GCC 的命令使用非常灵活,命令都以 gcc 开头然后配合待编译文件名,编译选项即可(可以说 GCC 就只有一条命令,只是编译选项较多而已)。命令选项可以随意组合,只需要注意选项是否包含参数即可,如果选项包含参数则参数需要紧紧跟随在选项后方。 阅读详情

相关推荐

Linux GCC常用命令以及GCC编译器

该文主要介绍了GCC常用的命令以及GCC的编译器的使用。

qq_56355200的博客 2871

arm平台下char默认数据类型与-fsigned-char

arm平台下char默认数据类型与-fsigned-char

我的博客 1830

Linux GCC常用命令总结

指定编译输出的名字 gcc编译器最常用的使用格式是: 1 gcc main.c 上面的命令执行完整的编译过程,并且生成一个a.out文件。 使用参数-o, 可以指定输出的文件名。 1 gcc main.c -o main 上面的命令会产生输出文件main。 为了理解GCC编译器的完整的编译过程,可以阅读Journey of a C Program t...

沉迷单车的追风少年 1930

Linux和gcc/g++常用命令总结

Linux和gcc/g++常用命令总结

2302_80345385的博客 1347

团子杂记:SAP收入确认工具RAR(Revenue Recognition&Reporting)在新收入准则下的应用

SAP收入确认工具RAR知识分享

Lucas1211的博客 4284

Kill5.37版本下,使用ARMcomplier6编译__asm 函数报错的问题

Kill5-5.37版本下,使用ARMcomplier6编译__asm 函数报错的问题 问题简要描述: 昨日更新了keil5软件的版本,从5.17更新到了5.37版本,然后编译STM32项目文件时,软件提示编译报错。报错问题如下: Build started: Project: QKsoftware *** Using Compiler 'V6.18', folder: 'E:\MDK-ARM\ARM\ARM\ARMCLANG\Bin' Build target 'QKsoftware' compiling

weixin_43644424的博客 1万+

Linux gcc常用命令

本文主要叙述了Linux gcc常用命令和gcc编译器背后的故事 文章目录Linux gcc常用命令gcc编译器背后的故事1.简介2.简单编译2.1 预处理(Preprocessing)2.2 编译为汇编代码(Comilation)2.3 汇编(Assembly)2.4 连接(Linking)3.多个程序的编译4.检错5.库文件连接 Linux gcc常用命令 gcc编译器背后的故事 gcc不是一个人在战斗,gcc背后其实有一堆战友。 gcc(GNU C Compiler)是编译工具,将C/C++编写的.

江南烟浓雨的博客 509

从防御者视角复盘:用WinArpAttacker和Wireshark在Windows上模拟并检测ARP欺骗攻击

本文详细解析了Windows平台下的ARP欺骗攻击与防御策略,通过WinArpAttacker和Wireshark工具模拟攻击并检测异常流量。文章涵盖实验环境搭建、攻击原理深度解析、流量特征分析及企业级防御方案,帮助安全运维人员全面掌握ARP攻击检测与防护技术。

weixin_30918633的博客 121

Linux Gcc背后的故事(常用命令)

Gcc的介绍及其常用命令使用一、Gcc的介绍1、简介2、gcc的结构二、Gcc的使用过程1、准备过程2、编译过程三、分析ELF文件1、ELF文件的段2、反汇编ELF四、常用命令1、gcc常用命令五、实验总结六、参考资料 一、Gcc的介绍 1、简介 GCC(GNU C Compiler)是编译工具。GNU编译器套件(GNU Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些语言的库(如libstdc++、libgcj等

m0_48861452的博客 205

车载以太网SOMEIP入门必看:从服务发现到事件订阅,一次搞懂三种核心通信模式(附报文实例)

本文深入解析车载以太网SOME/IP的三种核心通信模式:服务发现、方法调用和事件订阅,通过真实报文实例和仿真工具演示,帮助开发者快速掌握这一关键技术。文章特别强调服务发现机制的基础作用,并详细介绍了Request/Response与Fire&Forget两种方法调用模式的应用场景,为智能汽车网络通信开发提供实用指南。

weixin_30955617的博客 111

MaaS 商业模式全面分析报告:从技术赋能到商业变现的全链条探索

MaaS(模型即服务)商业模式正成为AI产业主流,2024年上半年中国市场规模达2.5亿元,预计2027年占比将提升至47%。该模式通过云服务提供预训练AI模型,大幅降低企业应用AI的技术门槛和成本。核心盈利方式包括按使用量计费、订阅制、定制化服务等,其中混合模式因灵活性成为趋势。MaaS产业链包含模型提供商、云平台、应用开发商和最终用户,重塑了AI产业格局。随着《数据法案》等监管加强,数据增值服务面临更严格合规要求。未来五年,中国MaaS市场增速预计超50%,用户规模将从2025年2.1亿增至2030年5

芯片行业20年 · 参与定义实现千万级量产出货 · AI芯片PM 2892

GCC 编译器背后的故事及Linux GCC常用命令

GCC 编译器背后的故事 GCC 不是一个人在战斗,GCC 背后其实有一堆战友。 GCC: GCC(GNU C Compiler)是编译工具。本文所要介绍的将 C/C++语言编写的程序 转换成为处理器能够执行的二进制代码的过程即由编译器完成。 Binutils: 一组二进制程序处理工具,包括:addr2line、ar、objcopy、objdump、as、ld、 ldd、readelf、 size 等。这 一组工具 是开发和 调试不可 缺少的工具 ,分别简 介 如下:...

afadgfansfa的博客 545

scp 出现Permission denied错误 解决方法

第一种说辞(来源于网络),说是scp涉及root远程登录,默认是没有打开的,只需要把配置文件中的permit打开即可。最后scp的时候发现还不行,只需要将其scp的服务器用户名 修改为root即可。第二种解决方案,将scp 传输的服务器用户名改为root即可。(这是最基本的,一开始我忽视了这个问题,导致一直scp不了)window系统下,向ubuntu操作系统 scp传输文件。

码农研究僧的博客 6729

linux中gcc常用命令

目录 一,单程序编译。 二 多程序编译 三、检错 四、库文件链接 五、gcc编译工具集中各软件 六、ELF文件 七 总结 八.参考文献。 一,单程序编译。 首先用gedit创建一个新的文本,输入一定的代码并保存。 1.预处理, 在终端输入以下代码做预处理, 此时就在文件夹内生成了一个后缀为.i的预处理文件 此文件内会发现里面的最后几行为我们的之前编写的代码,在此之前的几百行就是它的头文件代码。 2编译为汇编语言 用以上代码用hello.i文件生成hel...

qq_58174923的博客 219

RFSoC全面解析(八)—— ZCU111 RFSoC评估工具的上位机界面

下面的内容的参考文献为:XILINX公司文档UG1287。 XILINX公司提供了一个RFSoC的ADC/DAC性能的评估工具或者叫评估系统,这个文档就是讲如何使用这个评估工具的。 整个评估系统总的框图如上图所示,评估系统由上位机、ZCU111开发板、子卡以及网线、射频线缆组成。 ZCU111开发板内主要使用的RFSoC外设为时钟驱动和DDR4,RFSoC的PS部分和PL部分都使用了。 PS部分发挥的功能为通过网口与上位机通信,通过IIC总线控制时钟驱动芯片以及数据流控制等;PL部分发挥的功能为

4381

ollama使用CPU安装qwen-coder模型_并在eclipse中使用ai coder插件_配置本地qwen-coder模型_ollama常用操作记录---AI大模型应用探索0002

文章摘要:作者分享了在Windows 10上安装和使用Ollama模型的过程。尝试了不同规模的qwen-coder模型(7b、1.5b和0.5b),发现7b模型响应极慢(需35分钟),而1.5b模型表现较好(3秒响应)。最终选择1.5b版本用于代码开发辅助,支持多语言自动补全。同时提到在最新版Eclipse中的AIcoder配置问题。文章重点比较了不同模型规模在CPU环境下的实际使用体验和响应速度差异。

添柴程序猿的专栏 683

linux gcc编译 结果呢,Linux系统GCC常用命令和GCC编译过程描述

前言:GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。后来又扩展能够支持更多编程语言,如Fortran、Pascal、Objective-C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)。(百度百科,想了解自己查询)一.G...

weixin_35411480的博客 1151

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Linux GCC常用命令和GCC编译器背后的故事实例

为创建可执行文件,链接器必须要完成的主要任务是:符号解析(把目标文件中符号的定义和引用联系起来)和重定位(把符号定义和内存地址对应起来然后修改所有对符号的引用)。在 Linux 系统中,执行二进制文件时的动态库搜索路径的顺序通常为:首先搜索编译目标代码时指定的动态库搜索路径; 在 Linux 系统中,gcc 编译链接时的动态库搜索路径的顺序通常为:首先从 gcc命令的参数-L 指定的路径寻找;再从默认路径/lib、/usr/lib、/usr/local/lib 寻找。和/usr/lib寻找。

weixin_62901798的博客 224

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Linux常用命令介绍及gcc、gdb

这是在大学生mooc上学习Linux系统时做的笔记,其中对基本命令的介绍还是比较详细的。

qq_45083925的博客 318

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Linux下gcc编译常用命令详解

通过掌握这些常用的gcc编译命令,开发者可以更灵活、高效地进行程序开发和调试。同时,深入了解这些命令的原理和使用方式,有助于更好地理解编译过程,提高编程水平。希望本篇blog对您在Linux环境下使用gcc编译器有所帮助。

马上到我碗里来的博客 1240

Linux GCC 常用命令

Linux GCC 常用命令与汇编 文章目录Linux GCC 常用命令与汇编1 、简介2 、简单编译2.1 预处理2.2 编译为汇编代码2.3 汇编(Assembly)2.4 连接(Linking)3 、多个程序文件4、 检错5 、库文件连接5.1 编译成可执行文件5.2 链接5.3 强制链接时使用静态链接库6、汇编7、链接8、分析ELF文件8.1ELF 文件的段8.2反汇编 ELF 1 、简介 GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C

m0_56739646的博客 3629

Linux GCC常用命令和ELF文件

GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL 语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语 言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。

qq_57606252的博客 1156

Linux之gcc编译过程及其常用命令选项

文章目录前言一、gcc编译过程二、gcc命令常用选项 前言 gcc可以支持多种语言的编译(C,C++…) 如有错误,请指正,感谢! 一、gcc编译过程 预处理 :预处理器(cpp)将源代码中包含的头文件编译进来,进行简单替换,生成".i"文件 编译 :编译器(cc)首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,编译器(cc)把代码翻译成汇编语言(".s")文件。 汇编 :汇编器(as)把编译生成的".s"文件转成二进制目标代码(“.o”文件) 链接:连接器(ld

qq_44991159的博客 442

Linux中gcc的常用命令

GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。另一方面,说到 GCC 对于操作系统平台及硬件平台支持,.

qq_54496810的博客 2940
上一篇: vim 常用命令
下一篇: 鸟哥的私房菜基础篇--第三部分 读书笔记
parallelyk
博客等级 码龄15年 5粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值