Linux c动态链接库的生成及使用

本文详细介绍如何在Linux环境下创建动态链接库,并演示了具体的编译步骤与使用方法。此外,还介绍了如何解决动态库加载过程中遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一)动态链接库的编译

首先定义头文件so_test.h,以及三个.c文件test_a.c,test_b.c,test_c.c,我们将这几个文件编译成动态链接库libtest.so;

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 test_a...\n");
}

test_b.c

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

test_c.c

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

将上述几个文件编译成动态库:libtest.so

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

编译参数说明:(gcc命令参数)

-shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

动态链接库生成后,下面说明如何使用它:

test.c

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

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

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

使用如下命令测试是如何调用链接库的:

ldd test

可以看到是否能找到动态库.

编译参数说明:

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

然后运行./test,会发现出现如下错误:(运行的时候还是找不到动态库)

./test: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory

 可以通过如下方式来解决这个问题:

  1. 如果有root权限,可以直接将自己的库所在路径添加到/etc/ld.so.conf文件中。但一般这个文件中的内容都是一句“include /etc/ld.so.conf.d/*.conf”,因此最好在/etc/ld.so.conf.d/目录下新建一个文件 , 如“xxx.conf”,然后将自己的库所在路径添加到这个conf文件中。修改完文件后,以root身份运行   /sbin/ldconfig -v   。
  2. 如果没有root权限,则可以设置LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。

    在linux下设置LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=$PATH:$LD_LIBRARY_PATH

export方式在重启后会失效,所以可以在bashrc中修改LD_LIBRARY_PATH变量

转载于:https://www.cnblogs.com/softwindzy/p/3484209.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值