交叉编译连接器包含-ldl编译选项,但仍然报错undefined reference to ‘__dlsym‘

文章目录

  • 交叉编译连接器包含-ldl编译选项,但仍然报错undefined reference to ‘__dlsym‘
    • 问题排查
    • 成因
    • 反思

问题排查

为TX2交叉编译最新版本的BehaviorTree.Cpp库,使用cmake第一次编译BehaviorTree.Cpp的时候,生成behaviortree_cpp_v3.so时报出警告

warning: Using 'dlopen' in statically linked applications requires at runtime the shared library from the glibc version used for linking

虽然报出了这个警告,但是至少behaviortree_cpp_v3.so是生成出来了,只是后面的几个测试程序生成却报错:

../libbehaviortree_cpp_v3.so: undefined reference to '__dlsym'
../libbehaviortree_cpp_v3.so: undefined reference to '__dlopen'
../libbehaviortree_cpp_v3.so: undefined reference to '__dlclose'
../libbehaviortree_cpp_v3.so: undefined reference to '__dlerror'

不仅如此,将这个有问题的libbehaviortree_cpp_v3.so拿去给自己的程序使用仍然报找不到符号的错误。
去tx2的sysroot中找libdl.so
发现在/lib/aarch64-linux-gnu/libdl.so.2,查看导出动态链接符号

$ objdump -T libdl.so.2
0000000000000000 g    DO  .text  00000000000000cc  GLIBC_2.17  dlsym
0000000000000000 g    DO  .text  000000000000002c  GLIBC_2.17  dladdr

libdl.so则在tx2的sysroot中的/usr/lib/aarch64-linux-gnu/libdl.so

问题出在这里
libdl.so指向了/lib/aarch64-linux-gnu/libdl.so.2,这在TX2目标机上运行是没问题的,但是在host中,根本不存在这个文件。
交叉编译工具链需要的是包含了tx2-sysroot的位置即${tx2-sysroot}/lib/aarch64-linux-gnu/libdl.so.2
为了能够兼容目标和主机,修正libdl.so符号链接ln -sf ../../../lib/aarch64-linux-gnu/libdl.so.2 libdl.so.2

再次重新编译BehaviorTree.CPP一切正常。

成因

回顾前面在编译libbehaviortree_cpp_v3.so的时候报出的警告

warning: Using 'dlopen' in statically linked applications requires at runtime the shared library from the glibc version used for linking

其实已经提示了,没有找到动态库,作为代替使用了/lib/aarch64-linux-gnu/libdl.a,但静态库的符号默认是位置相关的,并且其符号名也是另外一套规则

$ objdump -t libdl.a
dlsym.o:        file format elf64-littleSYMBOL TABLE:
0000000000000000 l       .text  0000000000000000 $x
0000000000000000 l    d  .text  0000000000000000 .text
0000000000000000 l    d  .data  0000000000000000 .data
0000000000000000 l    d  .bss   0000000000000000 .bss
0000000000000000 l    d  .note.GNU-stack  0000000000000000 .note.GNU-stack
0000000000000000  w    F .text  0000000000000000 dlsym
0000000000000000         *UND*  0000000000000000 __dlsym

看到那个__dlsym了没有

反思

说过无数次不要忽视任何警告,对待警告,就要如同对待错误一样。这次出现的问题再一次印证了这句话。

解决交叉编译连接器包含-ldl编译选项,但仍然报错undefined reference to ‘__dlsym‘相关推荐

  1. 记录一个CMake编译报错undefined reference to vtable问题的解决

    在编写一个简单的CMake demo: 问题描述 文件结构如下:头文件和cpp分别放在两个文件夹下面 如果使用下面的写法,会报错"undefined reference to vtable ...

  2. Clion使用Socket报错undefined reference to `__imp_WSAStartup‘(解决办法)

    根据哔哩哔哩上的视频,使用Clion写一个Socket的服务器,但是当写完之后发现并不能运行,程序报错. ====================[ 构建 | MyHttpd | Debug ]=== ...

  3. MySQL 排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题

    MySQL 排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题 参考文章: (1)MySQL 排错-解决MySQL非聚合列未包含在GROUP BY子句报错问题 (2)https://ww ...

  4. 解决使用requests_html模块,html.render()下载chromium报错、速度慢问题

    解决使用requests_html模块,html.render()下载chromium报错.速度慢问题 参考文章: (1)解决使用requests_html模块,html.render()下载chro ...

  5. 解决vs2015使用fopen、fprintf等函数报错的问题

    解决vs2015使用fopen.fprintf等函数报错的问题 参考文章: (1)解决vs2015使用fopen.fprintf等函数报错的问题 (2)https://www.cnblogs.com/ ...

  6. 解决使用mybatis分页插件PageHelper的一个报错问题

    解决使用mybatis分页插件PageHelper的一个报错问题 参考文章: (1)解决使用mybatis分页插件PageHelper的一个报错问题 (2)https://www.cnblogs.co ...

  7. 解决Windows下运行php Composer出现SSL报错的问题

    解决Windows下运行php Composer出现SSL报错的问题 2015-01-14 20:05 在windows下运行composer却出现SSL报错: E:\www>php -f co ...

  8. springboot导入项目依赖报错_如何解决spring boot 项目导入依赖后代码报错问题

    如何解决spring boot 项目导入依赖后代码报错问题 2020-08-15  14:17:18 代码截图如图所示(由于本人问题已经解决,没来得及截图,所以在网上找了一张图片) ​ 针对图中所示的 ...

  9. 解决“(1146, “Table ‘mydb.django_session‘ doesn‘t exist“)”报错的方法

    解决"(1146, "Table 'mydb.django_session' doesn't exist")"报错的方法 参考文章: (1)解决"(1 ...

最新文章

  1. 嵌入式系统linux之光标隐藏解决
  2. Python入门篇-functools
  3. netty初探(2)
  4. 机房空调制冷、加热、加湿、除湿这些功能如何应用?
  5. copy_{to, from}_user()的思考
  6. 分享Silverlight/WPF/Windows Phone一周学习导读(11月14日-11月20日)
  7. 学硕论文选题计算机,计算机硕士论文题目分享
  8. 如何修改WP文章字体格式、字号大小、字体颜色
  9. 这位辩手,你想试试线上语音 battle 么?
  10. 僵尸启示录开始 Scheming Through Ep1 Mac游戏介绍
  11. android软件安装到平板,新人看过来 安卓平板装机必备软件推荐
  12. 日常开发中,String类中常用的方法
  13. frp frpc,frps开机自动运行 ubuntu
  14. sipp脚本撰写(二)
  15. 怎么从安卓设备转移数据到苹果_如何将数据从安卓手机转移到苹果手机
  16. 洛谷 P1873 砍树 (二分答案)
  17. php a链接跳转下载,PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而不是通过浏览器直接打开下载的文件...
  18. Entity Framework Core系列教程-3为现有数据库生成实体模型
  19. 关于BRDF公式理解的笔记
  20. 这10个问题帮你搞清楚SaaS是什么

热门文章

  1. c语言进程控制实验报告,操作系统进程的创建与控制实验报告.doc
  2. pink老师28-综合案例-新闻页面文字部分和图片
  3. 阿里巴巴“数据库侠客”:此行路远,不问归期
  4. MAC BigSur 版本11以上安装Adobe软件报程序包错误damage解决方案
  5. 远程控制软件哪个好用?
  6. 数据分析:消费者数据分析
  7. android banner广告接入,仅涉及技术
  8. linux icon图标大小,适用于Linux的5款最佳桌面图标集
  9. 为什么要学习----------[澳大利亚]安德鲁·马修斯
  10. 对口高考计算机原理,对口高考计算机原理-5.doc