linux中gcc的基本使用

linux中gcc的基本使用,第1张

概述linux中gcc的基本使用 1.gcc

GNU编译器套件(GNU Compiler Collection)原名為GNU C語言编译器(GNU C Compiler),因為它原本只能处理C語言。GCC在发布后很快地得到扩展,包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些语言的库(如libstdc++、libgcj等等)。GCC的初衷是为GNU *** 作系统专门编写的一款编译器。GNU系统是彻底的自由软件。此处,“自由”的含义是它尊重用户的自由。

GUN 编译器套件包含多种前端处理器,以翻译各种不同语言。当然,我们重点讨论的是基于C语言的前端处理器 GCC。

GCC 也是一种多目标(multitarget)编译器;换句话说,它通过使用可互换的后端处理器,为多种不同的计算机架构生成相应的可执行程序。

GCC 不仅支持C的许多“方言”,也可以区别不同的C语言标准;也就是说,可以使用命令行选项来控制编译器在翻译源代码时应该遵循哪个C标准。例如,当使用命令行参数-std=c99启动 GCC 时,编译器支持 C99 标准。

GUN99 c99

1.1 安装

安装命令

sudo apt install gcc g++# 在linux中写程序: gcc版本 > 4.8.5

查看版本

gcc -v/--versiong++ -v/--version

gcc与g++有什么区别?

gcc和g++都是GNU(组织)的一个编译器。

误区一:gcc只能编译c代码,g++只能编译c++代码。两者都可以,但是请注意:

后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,C++的语法规则更加严谨一些。编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。

误区二:gcc不会定义__cplusplus宏,而g++会

实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。

误区三:编译只能用gcc,链接只能用g++

严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价
1.2 gcc 工作流程

GCC 编译器在编译一个C语言程序时需要经过以下 4 步:

将C语言源程序预处理,生成.i文件。 头文件展开宏替换 define NUM 10int a = NUM注释删除xxx.c -> xxx.igcc -E xxx.c -o xxx.i预处理后的.i文件编译成为汇编语言,生成.s文件。 xxx.i -> xxx.s (得到汇编文件)gcc -S xxx.i -o xxx.s将汇编语言文件经过汇编,生成目标文件.o文件。 xxx.s -> xxx.o (二进制文件)gcc -c xxx.s -o xxx.o将各个模块的.o文件链接起来生成一个可执行程序文件。 xxx.o -> 可执行程序 (二进制的)gcc xxx.o -o xxx

1.3 gcc常用参数选项
gcc编译选项选项的意义
-E预处理指定的源文件,不进行编译
-S编译指定的源文件,但是不进行汇编
-c编译、汇编指定的源文件,但是不进行链接
-o [file1] [file2] / [file2] -o [file1]将文件 file2 编译成可执行文件 file1
-I directory指定 include 包含文件的搜索目录
-g在编译的时候,生成调试信息,该程序可以被调试器调试
-D在程序编译的时候,指定一个宏
-w不生成任何警告信息
-Wall生成所有警告信息
-Onn的取值范围:0~3。编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-l在程序编译的时候,指定使用的库
-L指定编译的时候,搜索的库的路径。
-fPIC/fpic生成与位置无关的代码
-shared生成共享目标文件。通常用在建立共享库时
-std指定C方言,如:-std=c99,gcc默认的方言是GNU C

参数 -D 使用场景: 程序调试的时候使用, 通过-D指定的宏打开log输出

#include <stdio.h>//#define DEBUGint main@H_419_276@(@H_419_276@)@H_419_276@{    int a = 10@H_419_276@;#ifdef DEBUG    printf@H_419_276@("我是一个程序猿, 我不会爬树...n"@H_419_276@)@H_419_276@;#endif    for@H_419_276@(int i=0@H_419_276@; i<3@H_419_276@; ++i@H_419_276@)    @H_419_276@{        printf@H_419_276@("hello, GCC!!!n"@H_419_276@)@H_419_276@;    @H_419_276@}    return 0@H_419_276@;@H_419_276@}

默认编译第7行代码不输出, 如果想要输出这句话, 可以使用-D

参数 -On 优化程序, 有4个级别
n 取值范围: 0-3
O0 -> 不优化, O1 -> 默认的级别, O3 -> 最高级别
最简单的例子:

int a@H_419_276@, b@H_419_276@, c@H_419_276@, d@H_419_276@;a = 10@H_419_276@;b = a@H_419_276@;c = b@H_419_276@;d = c@H_419_276@;// 优化:b = 10@H_419_276@;c = 10@H_419_276@;d = 10@H_419_276@;

参数 -std , 指定编译器规范
c最早的标准:c89
c99开始支持现在的书写习惯

int a = 10@H_419_276@;func@H_419_276@(@H_419_276@)@H_419_276@;int b  =5@H_419_276@;for@H_419_276@(int i=0@H_419_276@; i<5@H_419_276@; ++i@H_419_276@)

gcc -std=c99/gnu99 test.c -o test

-DDEBUG 参数和值直接的空格可有可无

gcc test.c -o test -DDEBUG   # define DEBUG
总结

以上是内存溢出为你收集整理的linux中gcc的基本使用全部内容,希望文章能够帮你解决linux中gcc的基本使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1013261.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)