Linux下GCC的安装及使用
GCC(GNU Compiler Collection)是由GNU开发的编程语言译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库。在Linux上进行开发离不开GCC,本文将给出gcc的安装和基本使用方法。
首先打开终端,输入以下命令
sudo apt-get install gcc

如上,就完成了。
gcc遵循的约定规则

gcc的选项参数如下:


gcc的使用方法和常用命令
首先简单说下一个由C语言编写的文件是如何被gcc翻译成可执行目标文件的。这个翻译过程分为四个阶段:预处理、编译、汇编和链接,通过使用不同参数可以选择执行不同的阶段。gcc的基本语法为:
gcc [options] [filenames] -o [outputfilename]
/*其中options就是编译器所需要的参数;filenames给出相关的文件名称,可同时给出多个文件;
outputfilename为生成文件名称。*/
1.一步到位,直接生成可执行文件
gcc text.c -o text
2.预处理阶段,把.c文件处理为.i文件
gcc -E test.c -o test.i
gcc -E -o test.i test.i
gcc -o test.i -E test.c
gcc -o test.i test.c -E
3.编译阶段,把.i文件生成汇编文件.s
gcc -S test.i
4. 汇编阶段,把汇编文件.s编译为目标文件.o
gcc -c test.s
5.链接阶段,把目标文件.o生成可执行文件.out
gcc test.o -o test
6.编译优化指令,有四个级别0~3,级别越高,优化效果越好,但编译时间越长,中间代码可读性差,0无优化效果
gcc -O1 test.c -o test
7.多文件汇编
gcc test1.c test2.c test3.c -o 文件名.out
8.包含调试信息-g
#1.无调试信息
gcc test1.c test2.c test3.c -o test
#2.无调试信息,程序变大
gcc test1.c test2.c test3.c -o test -g
9.显示更多警告-Wall(常用)
方便程序员检查代码的安全性
#include<stdio.h>
void main()
{
int a = 1.0*4;
return 0;
}
gcc -Wall test.c -o test
该选项相当于同时使用了下列所有的选项:
◆unused-function:遇到仅声明过但尚未定义的静态函数时发出警告。
◆unused-label:遇到声明过但不使用的标号的警告。
◆unused-parameter:从未用过的函数参数的警告。
◆unused-variable:在本地声明但从未用过的变量的警告。
◆unused-value:仅计算但从未用过的值得警告。
◆Format:检查对printf和scanf等函数的调用,确认各个参数类型和格式串中的一致。
◆implicit-int:警告没有规定类型的声明。
◆implicit-function-:在函数在未经声明就使用时给予警告。
◆char-subscripts:警告把char类型作为数组下标。这是常见错误,程序员经常忘记在某些机器上char有符号。
◆missing-braces:聚合初始化两边缺少大括号。
◆Parentheses:在某些情况下如果忽略了括号,编译器就发出警告。
◆return-type:如果函数定义了返回类型,而默认类型是int型,编译器就发出警告。同时警告那些不带返回值的 return语句,如果他们所属的函数并非void类型。
◆sequence-point:出现可疑的代码元素时,发出报警。
◆Switch:如果某条switch语句的参数属于枚举类型,但是没有对应的case语句使用枚举元素,编译器就发出警告(在switch语句中使用default分支能够防止这个警告)。超出枚举范围的case语句同样会导致这个警告。
◆strict-aliasing:对变量别名进行最严格的检查。
◆unknown-pragmas:使用了不允许的#pragma。
◆Uninitialized:在初始化之前就使用自动变量。
发生第一个错误时终止编译Wfatal-errors
项目很大,错误很多,找不到第一个错误时,可以使用测试一下。
关闭警告-w(小写的w)
慎用。
警告装换为错误Werror
可以参考使用不常用
编译时定义宏 -D
调试阶段很方便,量产时不需要再次处理源代码。
检查符合ANSI/ISO标准 --pedantic
gcc -pedantic warning_code.c -o warning_code
程序库
什么是库
在 windows 平台和 Linux 平台下都大量存在着库。
本质上来说库是 一种可执行代码的二进制形式,可以被操作系统载入内存执行。
由于 windows 和 linux 的平台不同(主要是编译器、汇编器和连接器 的不同),因此二者库的二进制是不兼容的。
linux 下的库有两种:静态库和共享库(动态库)。
二者的不同点在于代码被载入的时刻不同。
静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。
静态用.a为后缀, 例如: libhello.a
共享库(动态库)的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
动态通常用.so为后缀, 例如:libhello.so
共享库(动态库)的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
创建和使用静态库
ar rcs libname.a file1.o file2.o
ar -rcs libname.a file1.o file2.o
表示要把目标码file1.o和file2.o加入到静态库libname.a中。只有那么是可以修改的,其他是固定的。
1.创建add.c
2.生成add.o
3.生成libname.a静态库文件
4.创建main.c,调用库文件
gcc main.c libfun.a -o main
使用选项-I指定头文件路径
gcc main.c lib/libname.a -I ./inc/
本文介绍如何在Linux环境下安装和使用GCC编译器,并提供了一系列GCC的使用案例,包括编译优化、多文件编译和调试信息等。
792

被折叠的 条评论
为什么被折叠?



