将c编译成.so 并调用(ubuntu)


在这里插入图片描述

1. c 编译成动态链接库.so

动态链接库文件在windows平台下往往以.dll为后缀,而在linux平台则一般以.so为后缀,so是shared object的缩写。

以test_a.c,test_b.c,test_c.c 三个c文件为例
创建 so_test.h

#include"stdio.h"
void test_a();
void test_b();
void test_c();

创建test_a.c

#include"so_test.h"
void test_a()
   {
      printf("this is in test_a...\n");

   }

创建test_b.c

#include"so_test.h"
void test_b()
   {
      printf("this is in test_b...\n");

   }

创建test_c.c

#include"so_test.h"
void test_c()
   {
      printf("this is in test_c...\n");

   }

以下是创建动态库文件的操作:

执行

gcc test_a.c test_b.c test_c.c  -fpic -shared -o libtest.so 

执行ls可发现当前目录下多了一个libtest.so的文件

说明
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号), 不用该标志外部程序无法连接。相当于一个可执行文件

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

2. 动态库链接

创建 test.c

#include"so_test.h"
int main()
{
test_a();
test_b();
test_c();
return 0;
}

将test.c与动态库libtest.so链接生成执行文件test:

 gcc test.c -L. -ltest -o test

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

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

测试结果
在这里插入图片描述

3. 问题

ldd  test

执行test,可以看到它是如何调用动态库中的函数的。
在这里插入图片描述如果 libtest.so >> no found

说明环境变量指示动态连接器没有找到自己写的动态库libtest.so的路径

解决方式
新建libtest.conf 加载到环境变量。步骤如下:

  1. 创建 libtest.conf
cd /etc/ld.so.conf.d/
sudo touch libtest.conf
  1. 添加libtest.so的路径

在这里插入图片描述
3.重新加载

sudo ldconfig
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值