动态链接与静态链接的解释:
通过命令ldd+可执行文件名,可以查看可执行文件中调用的库
库文件名和引入库的名称
如:libc.so-> c库,去掉前缀lib,去掉后缀.so或.a。
动态链接与静态链接的工作原理
动态链接
静态链接
静态库与动态库
实例:
//myadd.h
#ifndef __MYADD_H__
#define __MYADD_H__
int add(int a,int b);
#endif
//myadd.c
#include"myadd.h"
int add(int a,int b)
{
return a+b;
}
//mysub.h
#ifndef __MYSUB_H__
#define __MYSUB_H__
int sub(int a, int b);
#endif
//mysub.c
#include"mysub.h"
int sub(int a,int b)
{
return a-b;
}
//main.c
#include<stdio.h>
#include"myadd.h"
#include"mysub.h"
int main()
{
int a=10;
int b=20;
printf("add(a,b)=%d\n",add(a,b));
printf("sub(a,b)=%d\n",sub(a,b));
}
生成静态库
将add.c、sub.c生成add.o和sub.o,然后进行打包生成静态库
将头文件和生成的静态库分别放在mylib目录下的include目录和lib目录下
生成静态库的语法格式
ar -rc 生成的静态库名称,想要打包的.o文件
libmymath.a就是打包好的静态库
使用Makefile打包静态库
使用静态库
Makefile中使用
生成动态库
使用动态库
编译选项
与静态库相同,只是少了-static选项
执行:执行报错
执行ldd命令查看可执行文件所需要的库,可以发现我们自己打包的动态库并没有被找到,因为我们是按动态链接来编译的,编译器知道我们的库在哪,但是操作系统不知道。
所以我们要引入一个人环境变量LD_LIBRARY_PATH,里面放着动态库的路径,我们要把自己的库的路径放进去。
于是,要执行命令 export LD_LIBRARY_PATH=./mylib/lib/
这时就可以正常执行了
Makefile使用动态库