【C语言】动态库

0. 文件清单

add.c

#include <stdio.h>
int add()
{
    printf("add init\n");
    return 0;
}

add.h

int add();

main.c

#include <stdio.h>
int mian()
{
    add();
    return 0;
} 
1. 生成 add.o

gcc -c add.c -fPIC

2. 生成共享库 libadd.so

gcc -o libadd.so add.o -shared

3. 编译主程序 app

gcc main.c -o app -L . -ladd
注:此时运行app会报错,原因是程序运行load动态函数库时,找不到该函数库
./app: error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory

4. 解决方法

a. 将libadd.so放到/usr/lib目录下,执行cp libadd.so /usr/lib,然后运行./app,程序运行正常,问题得到解决

b. 使用环境变量LD_LIBRARY_PATH,程序运行load动态函数库时,会先在LD_LIBRARY_PATH指定的目录下查找函数库,找不到就再去/usr/lib下查找,执行export LD_LIBRARY_PATH=/home/zzk/demo/workspace/,然后运行./app,程序运行正常,问题得到解决。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的 C 语言动态库导出的例子,供参考: 1. 创建一个头文件 `mylib.h`,声明需要导出的函数: ```c #ifndef MYLIB_H #define MYLIB_H // 导出函数,计算两个整数的和 int add(int a, int b); #endif ``` 2. 创建一个源文件 `mylib.c`,实现需要导出的函数: ```c #include "mylib.h" int add(int a, int b) { return a + b; } ``` 3. 编译生成动态库文件 `mylib.so`,注意需要使用 `-shared` 选项生成动态库: ```sh gcc -shared -fPIC mylib.c -o mylib.so ``` 4. 创建一个使用动态库的程序 `main.c`,包含头文件并调用动态库中的函数: ```c #include <stdio.h> #include <dlfcn.h> #include "mylib.h" int main() { // 动态链接库句柄 void* handle = dlopen("./mylib.so", RTLD_LAZY); if (handle == NULL) { printf("Failed to open library: %s\n", dlerror()); return 1; } // 加载库中的函数 int (*add_func)(int, int); add_func = (int (*)(int, int)) dlsym(handle, "add"); if (add_func == NULL) { printf("Failed to get symbol: %s\n", dlerror()); dlclose(handle); return 1; } // 调用库中函数 int result = add_func(1, 2); printf("Result: %d\n", result); // 卸载动态库 dlclose(handle); return 0; } ``` 5. 编译 `main.c` 并运行程序: ```sh gcc main.c -o main -ldl ./main ``` 输出结果为: ``` Result: 3 ``` 这个例子中,我们实现了一个简单的动态库并在程序中调用了其中的函数。需要注意的是,使用动态库需要在程序中手动加载和卸载动态库,并使用 `dlsym` 函数获取动态库中的函数地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值