目录
一.动静态库的原理
首先要知道可执行程序的生成过程:1,预处理 2,编译 3,汇编 4 ,链接
1.预处理
头文件include的包含,删注释,#define定义符号的替换,条件编译等..形成XXX.i文件
2.编译
编译: 完成词法分析、语法分析、语义分析、符号汇总等,形成XXX.x文件
3.汇编
将汇编指令转换成二进制指令,形成符号表,最终形成XXX.o文件
4.链接
合并段表,符号表的合并和重定位, 将生成的各个xxx.o文件进行链接,最终形成可执行程序。
看下面很简单的代码:
add.cpp
#include"add.h"
int add(int a,int b)
{
int sum=a+b;
return sum;
}
add.h
#pragma once
#include<iostream>
using namespace std;
extern int add(int a,int b);
test.cpp
#include"add.h"
int main()
{
int a=10;
int b=10;
int sum=add(a,b);
cout<<sum<<endl;
return 0;
}
结果:
包头文件用"",是在当前路径上找,<>是在系统目录下找。
test.cpp形成test.o时,之前只是将该头文件展开,只找到函数的声明,add 的符号表中的地址是无效的,链接时与add.o重定位后才有效,合并段表,形成可执行程序。
我们可以将函数的实现变为XXX.o文件,放在一起,并将该函数的声明(头文件)放入系统头文件中,就可以认为形成了一个库。后面要使用这个函数就可以配合那个库去使用。
1.静态库:Linux下静态库是以.a为后缀的文件。程序在编译链接时会将库里面的代码拷贝一份放入我们的可执行程序里面,程序运行的时候将不再需要静态库。