1. 静态库的编译
/// ku1.c
int add(int a,int b)
{
return a+b;
}
ku2.c
int sub(int a, int b)
{
return a-b;
}
///main.c
main()
{
int r = add(45.55);
int d = sub(4,1);
}
(1) 如果不同库 : $ gcc main.c ku1.c ku2.c -omain
(2) 使用静态库:
方法:
1. 编译成目标文件
-static (可选)
gcc -c -static 代码文件.c
2. 归档成静态库
ar工具
ar -r 静态库文件 被归档的文件
nm 工具 (查看函数符号表)
3.使用静态库
gcc 代码 静态库
——————————————————————————————————————
<1>
& gcc -static -c ku1.c --- 创建静态库
$ gcc -static -c ku2.c
<2>
$ ar -r ku.a ku1.o ku2.o
$ nm ku.a --- 查看创建的静态库
<3>
$ gcc main.c ku.a -omain
——————————————————————————————————————
2.动态库的编译(也成为共享库)
(1)工具
ldd (查看程序调用的动态库,只能查看可执行文件)
$ ldd main ---- 查看main 函数需要的库
readelf -h 查看可执行文件
$ readlf -h main ----查看执行文件的头
nm 查看库中函数符号
(2)动态库的编译
——————————————————————————————————————
$gcc -c -fpic ku1.c
$gcc -c -fpic ku2.c
$gcc -shared -odemo.so ku1.o ku2.o (非标准形式)
$gcc -shared -olibdemo.so ku1.o ku2.o(标准形式一般加上lib)
$gcc main.c -ldemo -L. -omain (无论那种,编译时都不要加lib)
---------------------------
此时的动态库还不能使用,因为还没有加载
--------------------------
3. 动态库的加载
动态库的函数的查找已经封装成库
dlopen 打开一个
dlsym 在打开的动态库找一个函数
dlcose 关闭动态库
——————————————————————————————————————
#include <stdio.h>
#include <dlfcn.h>
main()
{
void *handle = dlopen("./libdemo1.so",RTLD_LAZY);
int (*fun1)(int ,int) = dlsym(handle,"add");
int (*fun2)(int ,int) = dlsym(handle,"sub");
//int r = add(35,20);
//int d = sub(4,1);
int r = fun1(35,20);
int d = fun2(4,1);
printf("r=%d\n",r);
printf("d=%d\n",d);
}
——————————————————————————————————————
$ gcc main.c -omain -ldl --- 编译成功
$ ldd main
$ readelf -h main
-------------------------
/// ku1.c
int add(int a,int b)
{
return a+b;
}
ku2.c
int sub(int a, int b)
{
return a-b;
}
///main.c
main()
{
int r = add(45.55);
int d = sub(4,1);
}
(1) 如果不同库 : $ gcc main.c ku1.c ku2.c -omain
(2) 使用静态库:
方法:
1. 编译成目标文件
-static (可选)
gcc -c -static 代码文件.c
2. 归档成静态库
ar工具
ar -r 静态库文件 被归档的文件
nm 工具 (查看函数符号表)
3.使用静态库
gcc 代码 静态库
——————————————————————————————————————
<1>
& gcc -static -c ku1.c --- 创建静态库
$ gcc -static -c ku2.c
<2>
$ ar -r ku.a ku1.o ku2.o
$ nm ku.a --- 查看创建的静态库
<3>
$ gcc main.c ku.a -omain
——————————————————————————————————————
2.动态库的编译(也成为共享库)
(1)工具
ldd (查看程序调用的动态库,只能查看可执行文件)
$ ldd main ---- 查看main 函数需要的库
readelf -h 查看可执行文件
$ readlf -h main ----查看执行文件的头
nm 查看库中函数符号
(2)动态库的编译
——————————————————————————————————————
$gcc -c -fpic ku1.c
$gcc -c -fpic ku2.c
$gcc -shared -odemo.so ku1.o ku2.o (非标准形式)
$gcc -shared -olibdemo.so ku1.o ku2.o(标准形式一般加上lib)
$gcc main.c -ldemo -L. -omain (无论那种,编译时都不要加lib)
---------------------------
此时的动态库还不能使用,因为还没有加载
--------------------------
3. 动态库的加载
动态库的函数的查找已经封装成库
dlopen 打开一个
dlsym 在打开的动态库找一个函数
dlcose 关闭动态库
——————————————————————————————————————
#include <stdio.h>
#include <dlfcn.h>
main()
{
void *handle = dlopen("./libdemo1.so",RTLD_LAZY);
int (*fun1)(int ,int) = dlsym(handle,"add");
int (*fun2)(int ,int) = dlsym(handle,"sub");
//int r = add(35,20);
//int d = sub(4,1);
int r = fun1(35,20);
int d = fun2(4,1);
printf("r=%d\n",r);
printf("d=%d\n",d);
}
——————————————————————————————————————
$ gcc main.c -omain -ldl --- 编译成功
$ ldd main
$ readelf -h main
-------------------------