解决依赖库libunwind编译报错undefined reference to ‘lzma_stream_buffer_decode‘

本文主要是介绍解决依赖库libunwind编译报错undefined reference to ‘lzma_stream_buffer_decode‘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题背景

程序MyApp依赖第三方库libunwind,在A机器上编译好静态库libunwind.a之后,在B机器上基于libunwind.a编译MyApp。由于B机器上的lib环境与A机器上可能有差异,因此产生了编译报错。

错误信息

在编译MyApp时,链接libunwind静态库阶段,发生错误:undefined reference to ‘lzma_xx’:

MyApp/third_party/installed/lib/libunwind.a(elf64.o): In function `xz_uncompressed_size':
MyApp/third_party/src/libunwind/libunwind/src/elfxx.c:194: undefined reference to `lzma_stream_footer_decode'
MyApp/third_party/src/libunwind/libunwind/src/elfxx.c:201: undefined reference to `lzma_index_buffer_decode'
MyApp/third_party/src/libunwind/libunwind/src/elfxx.c:205: undefined reference to `lzma_index_size'
MyApp/third_party/src/libunwind/libunwind/src/elfxx.c:210: undefined reference to `lzma_index_end'
MyApp/third_party/src/libunwind/libunwind/src/elfxx.c:207: undefined reference to `lzma_index_uncompressed_size'
MyApp/third_party/src/libunwind/libunwind/src/elfxx.c:210: undefined reference to `lzma_index_end'
MyApp/third_party/installed/lib/libunwind.a(elf64.o): In function `_Uelf64_extract_minidebuginfo':
MyApp/third_party/src/libunwind/libunwind/src/elfxx.c:278: undefined reference to `lzma_stream_buffer_decode'
collect2: error: ld returned 1 exit status
src/tools/CMakeFiles/rocksdb_sst_dump.dir/build.make:154: recipe for target 'bin/rocksdb_sst_dump' failed
make[2]: *** [bin/rocksdb_sst_dump] Error 1

问题分析

编译报错问题有点奇怪,在C机器上是正常的,只在B机器上报错。另外libunwind本身已经是静态.a库,我们预期libunwind不会再依赖第三方库,但是在编译MyApp过程中链接libunwind时,还是报错依赖库liblzma找不到。

网上搜索问题,参考了能找到的各种链接:

  1. https://bugs.launchpad.net/ubuntu/+source/libunwind/+bug/1336912
  2. https://lore.kernel.org/all/1432040746-1755-3-git-send-email-adrian.hunter@intel.com/
  3. https://github.com/monero-project/monero/issues/866#issuecomment-227197274
  4. https://github.com/monero-project/monero/issues/907#issuecomment-232510599
  5. https://github.com/monero-project/monero/issues/1412

网上的说法有3种:有说依赖冲突的、有说缺少安装liblzma的、有说安装了liblzma但找不到名字的,因为都没有说明问题根源,所以只能尝试下各种解决方案。

经过定位,这个错误的原因找到了,因为A上安装了liblzma压缩库(/usr/lib/x86_64-linux-gnu/liblzma.a),B机器没有安装liblzma(系统库路径均查找不到),导致A机器上编译的libunwind在B机器环境中链接时找不到liblzma(使用cmake find_library验证也确实如此)。

问题的原因是B机器缺少安装liblzma,理论上在B机器上安装liblzma应该是能解决的,不过这种解决方法不太适用于B机器不具备在线网络安装的场景。此外还有一个现象是,有一个老版本的libunwind库在B机器上是能链接成功的(猜测老版本的libunwind应该不是在A机器上编译的),这也说明libunwind对liblzma的依赖应该不是必须的。

附命令:查看liblzma是否安装、是否在链接路径中:

sudo find / -name "*lzma*.a*"
ldconfig -p | grep lzma

附命令:cmake查找liblzma路径:

message(STATUS "looking for liblzma for libunwind")
find_library(LIBLZMA_LIBRARIES lzma)
if(NOT LIBLZMA_LIBRARIES STREQUAL "LIBLZMA_LIBRARIES-NOTFOUND")message(STATUS "liblzma is found")set(LIBUNWIND_LIBRARIES "${LIBUNWIND_LIBRARIES};${LIBLZMA_LIBRARIES}")include(FindPackageHandleStandardArgs)find_package_handle_standard_args(Libunwind "can not find libunwind" LIBUNWIND_INCLUDE_DIR LIBUNWIND_LIBRARIES)# show the LIBUNWIND_INCLUDE_DIR and LIBUNWIND_LIBRARIES variables only in the advanced viewmark_as_advanced(LIBUNWIND_INCLUDE_DIR LIBUNWIND_LIBRARIES)
else()message(WARNING "liblzma is not found")
endif()

解决方案

因此更加彻底的解决方案有如下选择:

  1. 方案1:当在机器A上编译第三方库libunwind时,明确禁止链接liblzma库。(此方案跟老版本的libunwind也保持兼容,猜测老版本的libunwind应该是在未安装liblzma的机器上编译的)
  2. 方案2:当在机器A上编译第三方库libunwind时,把liblzma库也纳入进来,显示编译liblzma为静态库并放入自己的MyApp目录中。

为了跟老版本保持兼容,优先尝试方案1。接下来寻找如何去明确禁止libunwind链接liblzma库。
在深入分析libunwind之后,找到了问题的本质:libunwind会在有安装liblzma环境的情况下,编译minidebuginfo,而minidebuginfo依赖liblzma库(具体代码见:https://github.com/libunwind/libunwind/blob/v1.2-stable/configure.ac#L273)。同时libunwind也给出了是否启用minidebuginfo的选项–enable-minidebuginfo,因此我们关闭掉minidebuginfo即可。

最终通过设置libunwind的编译选项--enable-minidebuginfo=no--disable-minidebuginfo,可优雅解决此问题:

./autogen.sh
# set disable-minidebuginfo to disable link liblzma
./configure --disable-shared --disable-minidebuginfo
make install

<完>

这篇关于解决依赖库libunwind编译报错undefined reference to ‘lzma_stream_buffer_decode‘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/738118

相关文章

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM

XML重复查询一条Sql语句的解决方法

《XML重复查询一条Sql语句的解决方法》文章分析了XML重复查询与日志失效问题,指出因DTO缺少@Data注解导致日志无法格式化、空指针风险及参数穿透,进而引发性能灾难,解决方案为在Controll... 目录一、核心问题:从SQL重复执行到日志失效二、根因剖析:DTO断裂引发的级联故障三、解决方案:修复

IDEA Maven提示:未解析的依赖项的问题及解决

《IDEAMaven提示:未解析的依赖项的问题及解决》:本文主要介绍IDEAMaven提示:未解析的依赖项的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录IDEA Maven提示:未解析的依编程赖项例如总结IDEA Maven提示:未解析的依赖项例如

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

解决Entity Framework中自增主键的问题

《解决EntityFramework中自增主键的问题》:本文主要介绍解决EntityFramework中自增主键的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Entity Framework中自增主键问题解决办法1解决办法2解决办法3总结Entity Fram