编写GNUGCC下的动态链接库程序

本文介绍了如何创建和使用动态链接库(DLL),包括通过GCC编译器生成动态链接库和在主程序中调用DLL的方法。展示了如何通过C语言实现简单的函数,并将其打包为动态链接库供其他程序调用。

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

先来一个简单的编译时动态链接的例子
创建文件function.h
#include <stdlib.h>                                                             
#define int_t int
int_t foo(int_t i, int_t j);


创建文件function.c
#include "function.h"                                                           

int_t foo(int_t i, int_t j)
{
if (i > j)
return i;
else
return j;
}


创建文件main.c
#include "function.h"                                                           

int_t foo(int_t i, int_t j)
{
if (i > j)
return i;
else
return j;
}


先编译生成动态链接库文件
gcc -shared -fPIC function.c -o function.so

-shared表示生成共享的目标文件,这种目标文件可以与其它相同标识(同为-fPIC或同为-fpic)的目标文件链接成可执行文件
-fPIC表示生成position-independent code(平台无关的代码)用于共享库。这种code在访问所有常量地址时,会通过系统的global offset table(GOT)。当程序开始运行时,动态加载器会去解析那个GOT。注,-fPIC比-fpic生成的代码要大,所以不用担心GOT大小超过限制的问题

最后将主程序与动态链接库链接
gcc -o main -L ./ main.c function.so

-L表示链接库的地址

注意运行时要把function.so放到/usr/lib之下


运行时动态链接的例子

编辑文件dltest.c
#include <stdlib.h>
#include <dlfcn.h>--------------------------------------------------------------void main()-
{-
int (*func)(int i, int j);-
void *dlhandle;-
char *dlError;-
printf("hello! I'm main.c\n");
dlhandle = dlopen("./function.so", RTLD_LAZY);-
if (dlhandle == NULL)
{
printf("dlhandle error\n");
}
dlError = dlerror();-
func = dlsym(dlhandle, "foo");-
printf("%i\n", func(10, 30));
dlclose(dlhandle);
}


同上文一样,生成function.so文件,只不过这个文件应该不用扔到/usr/lib中
链接文件
gcc -o dltest -ldl dltest.c

提一句选项-ldl的意思并不是说有一个gcc选项叫-ldl,而是-l dl的意思,把dl库链接过来,而这个dl库应该是包含了dlfcn.h等等文件吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值