Day 43 Linux入门学习

1.gcc安装

在终端输入:sudo apt-get install gcc

就可以安装gcc编译器了。

2.gcc遵循的约定:

 3.gcc的选项参数:

4.gcc的编译过程:

第一步,预处理,

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

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

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

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

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

第二步,编译阶段,

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

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

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

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

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

第三步,汇编,

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

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

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

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

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

第四步,链接,

在链接阶段,将一个个生成的.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
5.各阶段的常用参数:

编译,

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

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

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

汇编,

多文件: 

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

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

生成可执行程序,

多文件:

生成.o文件

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

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

生成可执行文件,gcc test1.c test2.c test3.c 

包含调试信息,

1.无调试信息

gcc test.c test1.c -o test

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

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

6.代码优化:

编译时使用选项-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来看优化结果     

7.警告:

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

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

  (1) 显示更多警告wall

方便检查代码的安全性

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

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

(4)警告转换为错误 Werror
8.检查是否符合C语言标准:使用-pedantic命令

9.程序库:

程序库

什么是库
在 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/
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值