Ubuntu 动态库

  1. 创建dll.c文件,内容如下:
#include <stdio.h>
void dll_fun(void)
{
  printf("hi,sir!\n");
}
  1. 创建动态库,分二步:
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即为要查找的名字。

  1. 运行程序:
./main

结果输出:
call dll(.so)
hi,sir!

gcc:
(-o:指定生成的输出文件;
-E:仅执行编译预处理;
-S:将C代码转换为汇编代码;
-wall:显示警告信息;
-c:仅执行编译操作,不进行连接操作。)
gcc -fPIC
[一般来说,对于所有地址可能被任意分配的东西,你都需要在用gcc编译
时加上-fPIC选项,以保证编译生成的东西是地址无关的][程序会在固定的地址加载运行,所以,他们不需要
地址无关这个特性,因而也不用在编译时加-fPIC选项。但是共享库(动态链接库)不同,他们在运行时加载,
因而地址是很随机的,这时候就需要用-fPIC选项进行编译了][至于静态库,他们也不是地址无关的,但是他们 包含了进行重定位的信息。所以也不需要-fPIC]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值