gcc用法记录与c语言编译过程_gcc -o命令-程序员宅基地

技术标签: c语言  开发语言  

一、 gcc基本语法

gcc -o 文件名(不带后缀) 源文件名
gcc -v -o a 1.c 显示详细的编译信息
编译过程如下:
/usr/lib/gcc/x86_64-linux-gnu/10/cc1
** as**
/usr/lib/gcc/x86_64-linux-gnu/10/collect2

二、编译相关

预处理

处理宏定义等,如图
gcc -E

#include<stdio.h>
#define ABC 10

int main()
{
        int a=ABC;
        printf("new day \n");
        return 0;
}

预处理指令
gcc -E -o 2.c 1.c
2.c文末可以看到代码如下

int main()
{
    
        int a=10;
        printf("new day \n");
        return 0;
}

编译

gcc -S
调用了cc1文件,生成了一个.s文件(汇编语言)

gcc -S -o a.s 1.c
在这里插入图片描述

汇编

gcc -c
调用as 生成二进制文件
gcc -c -o a.i 1.c

链接

gcc -o

三、预处理问题

#include<fun.h>#include"fun"
<>在库里找
“”在当前文件夹下与库里都找
当一个头文件不在当前文件夹下,而在其他路径时,可使用
gcc -I 文件路径
如在1.c中加入
#include<fun.h>
在1.c所在的文件夹下并没有fun.h这个文件,fun.h位于该文件夹下的fun文件夹中,可用
gcc -I -o 2 1.c

在处理宏定义时也有一个注意的问题

#include<stdio.h>
#define ABC 10+8

int main()
{
    
        printf("%d",ABC*5);
        return 0;
}
#include<stdio.h>
#define ABC (10+8)

int main()
{
    
        printf("%d",ABC*5);
        return 0;
}

前者输出50,后者输出90

预定义宏

__FUNCTION__
__LIFE__
__FILE__

一般用于工程量大的时候调试用的
例程如下:

#include<stdio.h>

int main()
{
    
        printf("%s  %s   %d",__FUNCTION__,__LIFE__,__FILE__);
        return 0;
}

可以得到printf所在位置的函数名,文件名,行数的信息。

切换调试版本和发行版本的编译方法

有时候程序里部分是用来调试用的代码,在正式使用时不适合表示出来,一行一行去//太过繁琐,可以通过一个宏定义来解决

#include<stdio.h>
#define ABC 10
int main()
{
    
        #ifdef ABC
            printf("DE_BUG\n");
        #endif
        printf("word\n");
        return 0;
}

这样可以通过修改宏定义来一键开关debug,但这样要修改源文件,我们还有另一种更好的方法:
gcc -D
在源文件中删去宏定义ABC 的语句,如果我们想进入调试版本,可以:
gcc -DABC -o 2 1.c
切记D与宏定义名直接相连。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mycey/article/details/123515523

智能推荐

echarts柱状图自定义hover上去的显示内容_自定义柱状图悬浮展示内容echarts-程序员宅基地

文章浏览阅读1.2w次,点赞2次,收藏14次。在option->toottip对象里面加formatter函数,代码如下:注意:参数params是series数组里面的每一个对象,params[i].data是返回具体的数值,如params[0].data依次返回11,22,33,44,55,66,77,88,99,78,78,199详情请查看官方文档:https://www.echartsjs.com/zh/option.html..._自定义柱状图悬浮展示内容echarts

IC基础知识(六)SV中default input #1 output #1的解释_default input #1step-程序员宅基地

文章浏览阅读4.7k次,点赞7次,收藏49次。SV中default input #1 output #1的解释_default input #1step

DataFrame基础知识-程序员宅基地

文章浏览阅读4.2k次,点赞11次,收藏13次。DataFrame:可以看出分布式Row对象的集合,在二维表数据集的每一列都带有名称和类型,这些就是schema(元数据)Select:col:某一列,as:重命名 filter:过滤groupBy() ,对记录进行分组sort排序。,并且可以从很多数据源中创建,如结构化文件、外部数据库、Hive表等数据源。DataFrame提供了两种语法风格,1 DSL风格语法,2 SQL语法风格。DataFrame:除了提供比RDD更丰富的算子外,更重要的特点是。,DataFrame可以完成RDD的绝大多数功能。_dataframe

Linux系统产生随机数/dev/random 和 /dev/urandom_/dev/random 安全随机数-程序员宅基地

文章浏览阅读942次。1. 基本介绍    /dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流。很多解密程序与安全应用程序(如SSH Keys,SSL Keys等)需要它们提供的随机数据流。  这两个设备的差异在于:/dev/random的random pool依赖于系统中断,因此在系统的中断数不足时,/dev/random设备..._/dev/random 安全随机数

递归最佳实践_递归 翻译字典 最佳实践-程序员宅基地

文章浏览阅读273次。可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了!可能也有一大部分人知道递归,也能看的懂递归,但在实际做题过程中,却不知道怎么使用,有时候还容易被递归给搞晕。也有好几个人来问我有没有快速掌握递归的捷径啊。说实话,哪来那么多捷径啊,不过,我还是想写一篇文章,谈谈我的一些经验,或许,能够给你带来一些帮助..._递归 翻译字典 最佳实践

java库net2.0下载_.NET Framework各版本独立下载.NET Framework 3.5下载.NET Framework 2.0下载...-程序员宅基地

文章浏览阅读377次。Microsoft.NETFramework 4.5(在线安装 x86_x64)下载地址:点击这里!----------------------------------------------------------------------分割线---------------------------------------------------------------------------..._java的net包在哪下

随便推点

MonkeyRunner不是内部或外部命令,也不是可运行的程序的两种解决办法_为什么说monkey不是内部程序-程序员宅基地

文章浏览阅读5.6k次,点赞3次,收藏6次。前两天使用monkeyrunner都还是好好的,今天不知道电脑为啥抽风就运行不了报错“monkeyrunner不是内部或外部命令,也不是可运行的程序或批处理文件。”环境变量也没有问题,并没有修改过。研究了一番发现可能跟我用Android Studio把 SDK Tools从 25.1.3 更新到 26.0.2 版本有关系。更新之后 monkeyrunner.bat 文件的路径发生了改变,跑到了too_为什么说monkey不是内部程序

Apollo智能驾驶|apollo8.0新特性讲解-感知框架(2)-程序员宅基地

文章浏览阅读627次,点赞46次,收藏46次。百度Apollo开放平台自上线以来始终保持着创新和高频的自我迭代,从最开始聚焦于基础能力的搭建,走向侧重场景能力的发展,再升级为对平台工程易用性精益求精的追求。12月28日,百度Apollo开放平台面向所有开发者,正式推出了Apollo自动驾驶开放平台的全新升级版本——Apollo 8.0,进一步夯实了平台的易用性,让开发者操作更简单易上手。_apollo8.0

QueryWrapper是什么?-程序员宅基地

文章浏览阅读1.7k次。是 MyBatis-Plus 框架中的一个查询条件构造器,用于构建 SQL 查询的条件。还提供了许多其他的方法来支持各种不同的查询条件,如模糊查询、范围查询、排序等。还有其他更多的方法和功能,可以根据具体的业务需求进行查阅和使用。,你可以通过链式调用方法来设置查询条件,例如使用。你可以根据具体的查询需求,使用适当的。方法来构建查询条件。方法执行查询,并返回结果。方法设置不等于条件等。_querywrapper

QSqlQuery 介绍-程序员宅基地

文章浏览阅读3.9k次。QSqlQuery类参考[sql模块]QSqlQuery类提供了一种执行和操纵SQL语句的方式。 详情请见……#include &lt;qsqlquery.h&gt;被QSqlCursor继承。所有成员函数的列表。公有成员QSqlQuery ( QSqlResult * r )QSqlQuery ( const QString &amp; query = QString::null, QSqlDa..._qsqlquery

推荐一款IDEA插件Grep Console_grepconsole idea社区版2021看不清-程序员宅基地

文章浏览阅读2.0k次。话说,楼主之前9年多用的Java开发工具都是Eclipse,一直用着很不错。不过因为现在公司的小伙伴们大多都是用IDEA,所以逼迫自己一把,开始使用IDEA。真是不用不知道啊,IDEA真的是太好用了。以下我会整理一些IDEA使用的经验。Grep Console解决问题开发阶段,我们会经常看控制台打印的日志。但是不可能一行一行的一直盯着看吧。这时我们肯定会想到搜索功能,搜索后的效果是这个样子..._grepconsole idea社区版2021看不清

Kafka学习笔记-程序员宅基地

文章浏览阅读1.2k次。本文转载来自:https://www.cnblogs.com/qingyunzong/p/9004703.htmlKafka是Apache下的一个子项目,是一个高性能跨语言分布式发布/订阅消息队列系统,图展示了Kafka的相关术语以及之间的关系上图一个topic配置了3个partition。Partition1有两个offset:0和1。Partition2有4个offs..._kafka border.id=1 和等于1的区别

推荐文章

热门文章

相关标签