GCC编译过程,静态库与动态库

本文详细介绍了Linux下GCC编译器的工作过程,包括include头文件、宏定义、选择性编译,重点讨论了静态库和动态库的概念、使用场景及编译方法,包括静态编译与动态编译的步骤和注意事项。
摘要由CSDN通过智能技术生成

一、Linux下GCC编译器编译过程

序号 过程名 过程 代码
1 预处理preprocessing 将.c中的头文件,宏定义展开及替换,生成.i文件 gcc -E -o hello.i hello.c
2 编译compilation 将预处理之后的.i文件生成汇编代码.s文件 gcc -S -o hello.s hello.i
3 汇编assembly 把.s汇编文件生成.o目标文件 gcc -c -o hello.o hello.s
4 链接linking 将汇编生成的.o obj文件,系统库的obj文件,库文件链接起来,最终生成可以在特定平台运行的可执行程序 gcc -o hello hello.o

二、include 包含头文件

  1. #include <>
    【只能包含标准库的头文件.h】 用尖括号包含头文件,在系统指定的路径下找头文件。
  2. #include " "
    【不仅能包含标准库的头文件.h 多了一个在当前路径下找头文件】 用双引号包含头文件,先在当前目录下找头文件,找不到,再到系统指定的路径下找。

三、define

 定义一个宏	      		#define P 3.14
 终止一个宏				#undef P 		(想在中间终止宏,后面遇到宏不可用)
 
 不带参宏             #define  P      3.1415
 带参宏               #define S(a,b)   (a)*(b)        (宏的形参没有类型)

宏是在预编译的时候进行替换
宏的作用范围:从定义的地方到本文末尾

带参宏和带参函数的区别

1.带参宏被调用多少次就会展开多少次,执行代码的时候没有函数调用过程,不需要压栈弹栈。
所以带参宏,是浪费了空间,因为被展开多次,节省了时间。
2.带参函数,代码只有一次,存在代码段,调用的时候去代码段取指令,调用的时候要压栈弹栈。有个调用的过程,带参函数是浪费了时间,节省了空间。
3.带参函数的形参是有类型的,带参宏的形参是没有类型名

四、选择性编译

(1) ifdef
如果在当前.c上定义过AA这个宏,就编译代码段1 ,否则编译代码段2

#ifdef AA
    代码段1
#else
    代码段2
#endif

(2) ifndef
如果在当前.c上没有定义过BB这个宏,就编译代码段1 ,否则编译代码段2

#ifndef BB
    代码段1
#else
    代码段2
#endif
一般用在#include"aa.h"中,避免头文件重复包含。
在aa.h中
    #ifndef __FUN_AA__
    #define __FUN_AA__
    extern int funaa*(int x, int y);
    #endif

五、静态库与动态库

我们经常用到库函数,比如printf,strcpy
实际上库函数都是由编译系统提供的,它会将库函数的源码对应的.c 编译成库文件,
我们的代码中只需要调用这些库函数所在的库文件就可以了 (就是#include<stdio.h>)。
1、什么是静态、动态编译?

静态编译: 使用的是静态库文件进行编译
                  gcc -static hello.c -o hello
                  要把静态库文件打包编译到可执行程序中

动态编译: 使用的是动态库文件进行编译(默认)
                  gcc hello.c -o hello
                  不会把动态库文件打包编译到可执行程序中,只是编译链接关系
                  运行可执行程序时需要依赖静态库

**静态链接:** 是由编译器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值