- 创建dll.c文件,内容如下:
#include <stdio.h>
void dll_fun(void)
{
printf("hi,sir!\n");
}
- 创建动态库,分二步:
gcc -c -fPIC dll.c //create dll.o
gcc -shared -fPIC -o libdll.so dll.o //create libdll.so
至此,动态库创建完成。
参数-fPIC使.so文件的代码段变为真正意义上的共享,
如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位。
3. 测试动态库的调用
创建main.c文件,内容如下:
#include <stdio.h>
int main(void)
{
printf("call dll(.so)\n");
dll_fun();
return 0;
}
编译命令:
gcc -o main main.c -L. -ldll
其中-L.:表示在当前目录查找库文件,如果写为:-L./lib 则表示在当前目录的lib目录下查找库文件。
-ldll:表示查找的动态库名字为dll,生成的动态库名字为 libdll.so,链接时需要去头去尾,去掉lib和.so,剩下的dll即为要查找的名字。
- 运行程序:
./main
结果输出:
call dll(.so)
hi,sir!
gcc:
(-o:指定生成的输出文件;
-E:仅执行编译预处理;
-S:将C代码转换为汇编代码;
-wall:显示警告信息;
-c:仅执行编译操作,不进行连接操作。)
gcc -fPIC
[一般来说,对于所有地址可能被任意分配的东西,你都需要在用gcc编译
时加上-fPIC选项,以保证编译生成的东西是地址无关的][程序会在固定的地址加载运行,所以,他们不需要
地址无关这个特性,因而也不用在编译时加-fPIC选项。但是共享库(动态链接库)不同,他们在运行时加载,
因而地址是很随机的,这时候就需要用-fPIC选项进行编译了][至于静态库,他们也不是地址无关的,但是他们 包含了进行重定位的信息。所以也不需要-fPIC]