存在程序main通过dlopen使用libA中的符号:
main.c:
1 #include <stdio.h>
2 #include <dlfcn.h>
3
4 typedef void (*func)(void);
5
6
7 void test_main()
8 {
9 return;
10 }
11
12
13 int main()
14 {
15 void *handle = dlopen("./libA.so", RTLD_NOW|RTLD_GLOBAL);
16 if(NULL == handle)
17 {
18 fprintf(stderr, "%s\n", dlerror());
19 return 1;
20 }
21 func test = dlsym(handle, "test");
22
23 (*test)();
24
25 return 0;
26
27 }
libA的代码又反向依赖main中符号:
1 void test()
2 {
3 test_main();
4 return;
5 }
这样,gcc -g main.c -ldl 编译程序(注意这里没有链接libA),运行程序main时会报错,报错的原因就是dlopen失败,失败的原因就是:
- ./libA.so: undefined symbol: test_main
解决方法有两个:
A、不要dlopen打开这个库,即注释掉dl过程直接调用test,此时直接大大方方的-l就可以了
- gcc -g main_ld.c -L. -lA
B、 使用所述参数,将test_main放到程序main的动态符号表中,保证dlopen的成功:
- gcc -rdynamic -g main.c -ldl
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2022-07-21 RTC 系统音视频传输弱网对抗技术
2021-07-21 FFMPEG AvFilter使用实例(实现视频缩放,裁剪,水印等)
2021-07-21 FFmpeg filter
2021-07-21 ffmpeg用filter实现视频scale
2021-07-21 H.264流媒体协议格式中的Annex B格式和AVCC格式深度解析
2021-07-21 解码前世今生——avcodec
2021-07-21 ffmpeg结构体(6)之AVFrame及其相关函数