BSP Day 43

本文介绍如何在Linux环境下安装和使用GCC编译器,并提供了一系列GCC的使用案例,包括编译优化、多文件编译和调试信息等。

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/


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixiaxiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值