静态库和动态库
一、基础概念
1.c语言编译的过程?
预处理:将包含的头文件展开到include的地方,宏替换
gcc -E hello.c -o hello.i
cpp hello.c >hello.i
编译:编译的过程就是将 预处理 完的文件进行一系列的词法分析、语法分析、语义分析及优化,最后生成 .s 汇编代码文件
gcc -S hello.i -o hello.s
汇编:汇编器是将汇编代码转变成机器可以执行的指令(二进制), 每一条汇编代码几乎都对应着一条机器指令。最后生成一个* .o 目标文件
gcc -c hello.s -o hello.o
as hello.s -o hello.o
链接:链接就是将我们编译出来的目标文件和我们代码所用到的库文件一起打包成一个可执行文件的过程。
2.静态库和动态库的区别
1.静态库的代码在编译的过程中已经载入到可执行文件中,程序运行时,不再需要静态库,所以最后生成的可执行文件相对较大。
2.静态库链接的时候把库直接加载到程序中,而动态库链接的时候,它只是保留接口,将动态库与程序代码独立,这样就可以提高代码的可复用度和降低程序的耦合度;
3.程序运行时需要动态库的存在;
4.静态库后缀为.a;动态库后缀为.so
3.库的命名规则
libc.co.6
二、如何做一个静态库,并使用
1.文件结构
//head.h
#ifndef _HEAD_H_
#define _HEAD_H_
#define N 20
extern int find_max(int a,int b);
#endif
//main.c
#include
#include"head.h"
int main(int argc, const char *argv[])
{
int x=20,y=10;
int max=0;
max=find_max(x,y);
printf("N:%d\n",N);
printf("max: %d\n",max);
return 0;
}
//max.c
#include "head.h"
int find_max(int a,int b)
{
return a>b? a:b;
}
2静态库制作
(1)将 C 源文件(xx.c)编译成目标文件(xx.o);
gcc -c max.c -o max.o
(2)将目标文件打包成静态库
ar crs libmax.a max.o
静态库已经创建好了
注意:
ar 创建库的命令
c ---creat 创建
r ---repace 以替换的方式在库中插入模块
s ---symbol 将目标文件的索引符号表添加到库中
(3)静态库的使用
链接库和头文件生成a.out,或者在命令后 -o
用法:gcc 编译的文件.c -L 库的路径 -l 库的名字 -I 头文件所在路径
gcc main.c -L. -lmax -I.
注:Linux 系统中链接器默认查找的库文件路径为/lib 和/usr/lib
Linux 系统中头文件默认查找的路径为/usr/include
三、如何做一个动态库,并使用
(1)先得到与位置无关的代码的目标文件;
gcc -fPIC -c max.c
(2)生成动态库
gcc -shared max.o -o libmax.so
(3)把动态库路径加入环境变量,或者把动态库加入默认动态库的路径/usr/lib 或者/lib 下。只有这样才能在运行程序时,程序能够找到动态库并调用。
sudo cp libmax.so /usr/lib/
//或者把动态库所在路径加入到环境变量中
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/.......
(4)使用动态库
gcc main.c -L . -lmax -I.
(5)运行程序
./a.out -lmax
end
Original: https://blog.csdn.net/jun8086/article/details/127808373
Author: Jun-86
Title: 静态库和动态库
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/656326/
转载文章受原作者版权保护。转载请注明原作者出处!