Day 43 Linux入门(gcc)

1. gcc安装和使用

1.1 概述

gcc是将C/C++文件,通过预编译、编译、汇编、链接生成可执行文件

1.2 gcc遵循的约定规则

1.2.1 gcc的文件类型约定

1.2.2 gcc的选项参数

 1.2.3 gcc的编译过程

 (1)预处理

在预处理阶段,gcc会把预处理的命令扫描并处理完毕(头文件、宏定义、宏函数),该阶段会生成.i的文件

gcc -E 文件名.c -o 文件名.i

gcc -o 文件名.i -E 文件名.c

gcc -E -o 文件名.i 文件名.c

gcc -o 文件名.i 文件名.c -E

其中-o后面要跟文件名+.i

(2)编译

在编译阶段,gcc把预处理结果编译成汇编或目标模块,生成.s文件

gcc -S 文件名.c -o 文件名.s

gcc -o 文件名.s -S 文件名.c

gcc -S -o 文件名.s 文件名.c

gcc -o 文件名.s 文件名.c -S

 (3)汇编

在汇编阶段,编译器把编译出来的结果生成具体的CPU上的目标代码,生成.o文件

gcc -C 文件名.c -o 文件名.o

gcc -o 文件名.o -C 文件名.c

gcc -C -o 文件名.o 文件名.c

gcc -o 文件名.o 文件名.c -C

(4)链接

在链接阶段,将一个个生成的.o文件,链接起来生成可执行文件,在Windows上是.exe,Linux上是.out

gcc test.o -o test

gcc -o test.c test.o

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

gcc test1.c test2.c test3.c -o test2

1.3 常用参数

1.3.1 预处理

不支持多文件处理,单文件处理上面讲过了

1.3.2 编译

多文件:系统默认按照源文件,生成对应的.s文件

gcc -S test1.c test2.c test3.c

gcc test1.c test2.c test3.c -S

1.3.3 汇编

多文件: 

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

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

1.3.4 生成可执行程序 -o

多文件:

生成.o文件

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

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

1.3.5 生成可执行文件

gcc test1.c test2.c test3.c 

1.3.6 包含调试信息 -g

1.无调试信息

gcc test.c test1.c -o test

2.有调试信息,程序会变大

gcc test.c test1.c -o test -g 

1.3.7 代码优化 O(n)

编译时使用选项-0可以告诉gcc同时减小代码的长度和执行时间,其效果等价于-01。
在这个级别. 上能够进行的优化类型虽然取决于目标处理器,但一般都会包括线程跳(Thread Jump)和延迟退栈(Deferred Stack Pops)两种优化。
选项-02告诉gcc除了完成所有-01级别的优化之外,同时还要进行一些额外的调整工作,如处理器指令调度等。
选项-03则除了完成所有-O2级别的优化之外,还包括循环展开和其它- -些 与处理器特性相关的优化工作。通常来说,数字越大优化的等级越高,同时也就意味着程序的运行速度越快。
许多Linux程序员都喜欢使用-O2选.项,因为它在优化长度、编译时间和代码大小之间,取得了比较理想的平衡点。
 

默认无优化

gcc test.c -o test

调整为o2优化

gcc test.c -o test1 -o2

注:我们可以用

time ./test

time ./test1来看优化结果        

1.3.8 提示警告

gcc有很多编译选项,警告选项:指定头文件、库路径;优化选项。

默认级别是编译器认为的警告,满足大部分场合使用

  (1) 显示更多警告wall

方便检查代码的安全性

(2)发生第一个错误中止编译 Wfatal-errors

(3)关闭警告 -w(不要使用)

(4)警告转换为错误 Werror

1.3.9 编译时定义宏 -D,在我们的程序可能有宏定义,但是我们可能在程序中没有定义,就可以在编译阶段定义宏定义

1.4 检查是否符合C语言标准 -pedantic

1.5 程序库

程序库

什么是库
在 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值