linux 加载so -ldl,linux下动态链接问题(.so文件的编写与调用) .

.o 就相当于windows里的obj文件

.a 是好多个.o合在一起,用于静态连接

.so 是shared object,用于动态连接的,和dll差不多

sotest.c

#include

int test(int a){

printf("#########:%d\n",a);

return a;

}

//

test.c

#include int test(int a);

int main(int argc,char argv[])

{

int num=0;

num =test(2);

printf("num:%d\n",num);

return 0;

}

分析GCC的两条命令

1.把.c文件变成so库

gcc -shared -o libblog.so input.c

用该命令就把.c文件变成了so库

2.编译.c文件为可执行文件

*如果你在你的.c文件文件中包括了包含so库函数声明的头文件,

则你在编译时用的命令为:

gcc -L/your/lib/path -lblog -o blogexe blogexe.c

以上so库名称必须为libblog.so(linux 省略掉了lib等);

*如果你希望在你的程序里运行时加载,用dlopen的方式打开,使用库里面的函数和数据。

则返回函数的形式( man dlopen 的举例)为:

int (*cos)(double);

cos=dlsym(dl-handle,"cos");

printf("%f",(*cos)(2.0));

或者这样

typedef int (*COSFN)(double);

COSFN cos;

cos=dlsym(dl-handle,"cos");

printf("%f",cos(2.0));

必须这样编译:

gcc -rdynamic -s -o blogexe blogexe.c -ldl

3.cpp文件里面函数和符号的导出

在需要导出变量和函数的前面加上extern "C"

详细说明

-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正的代码段共享的目的

-L. :表示要连接的库在当前的目录中

-lmy:编译器查找动态链接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值