Linux下C语言如何调用动态库?教你简单实现 (linux c调用动态库)

动态库是Linux下常用的一种共享库,与静态库不同,它在程序运行时才会被载入内存,并在程序退出时卸载,因此相比静态库可以节省内存空间。动态库有很多种类型,例如共享目标文件(.so)和动态链接库(.dll)等。C语言支持通过调用动态库中的函数来实现代码重用,本文将简单介绍如何在Linux下使用C语言调用动态库。

一、动态库的创建

在Linux下创建动态库的方法如下:

$ gcc -shared -o libtest.so test.c

其中,-shared指示编译器生成一个共享目标文件,-o指示输出文件名为libtest.so,test.c为源码文件名。

二、C语言调用动态库

为了调用动态库中的函数,需要在C程序中声明函数的原型,并使用dlopen()、dlsym()和dlclose()等系统调用来打开、查找和关闭动态库。

首先声明函数原型,例如test.c中定义了一个名为test()的函数:

“`c

#include

void test()

{

printf(“Hello, World!\n”);

}

“`

然后,在调用test()函数之前,需要使用dlopen()函数来打开动态库,并将其句柄存储在一个void类型的指针中:

“`c

#include

int mn()

{

void* handle = dlopen(“./libtest.so”, RTLD_LAZY);

if (!handle)

{

printf(“%s\n”, dlerror());

return 1;

}

typedef void (*func_t)();

func_t func = (func_t)dlsym(handle, “test”);

if (!func)

{

printf(“%s\n”, dlerror());

return 1;

}

func();

dlclose(handle);

return 0;

}

“`

在上述代码中,我们首先使用dlopen()函数打开了名为libtest.so的动态库,如果打开失败则输出错误信息,并退出程序。然后,使用dlsym()函数查找名为test的函数,并将其转换为一个函数指针,最后通过函数指针调用test()函数。需要注意的是,dlsym()函数会返回一个void指针,需要将其显式转换为正确的函数指针类型。使用dlclose()函数关闭动态库句柄。

三、完整示例代码

test.c:

“`c

#include

void test()

{

printf(“Hello, World!\n”);

}

“`

mn.c:

“`c

#include

#include

int mn()

{

void* handle = dlopen(“./libtest.so”, RTLD_LAZY);

if (!handle)

{

printf(“%s\n”, dlerror());

return 1;

}

typedef void (*func_t)();

func_t func = (func_t)dlsym(handle, “test”);

if (!func)

{

printf(“%s\n”, dlerror());

return 1;

}

func();

dlclose(handle);

return 0;

}

“`

编译:

$ gcc -shared -o libtest.so test.c

$ gcc -o mn mn.c -ldl

运行:

$ ./mn

Hello, World!

四、


数据运维技术 » Linux下C语言如何调用动态库?教你简单实现 (linux c调用动态库)