Debian Bookworm系统下能否同时使用libunwind8与libunwind-14?
解决Debian Bookworm中libc++与libunwind8共存的问题
以下是几种可行的方案:
方案1:手动隔离libunwind8到非系统路径
这种方法无需修改系统包依赖,通过指定编译/运行路径区分两个版本的libunwind:
- 先正常安装libc++-dev(会自动安装依赖的libunwind-14-dev)
- 从Debian Bullseye镜像站下载
libunwind8和libunwind-dev的deb包,解压到自定义路径(比如/opt/libunwind8/):dpkg-deb -x libunwind8_1.3.2-2+b1_amd64.deb /opt/libunwind8/ dpkg-deb -x libunwind-dev_1.3.2-2+b1_amd64.deb /opt/libunwind8/ - 编译依赖libunwind8的代码时,显式指定头文件和库路径:
g++ your_code.cpp -I/opt/libunwind8/usr/include -L/opt/libunwind8/usr/lib/x86_64-linux-gnu -lunwind -stdlib=libc++ - 运行程序时,指定加载libunwind8的库路径:
LD_LIBRARY_PATH=/opt/libunwind8/usr/lib/x86_64-linux-gnu ./a.out
方案2:自行编译不带stacktrace依赖的libc++
Debian官方的libc包因支持std::basic_stacktrace依赖libunwind-14,你可以编译一个禁用该功能的自定义libc:
- 安装编译依赖:
apt install cmake llvm-14-dev clang-14 - 克隆LLVM libc++源码(对应Bookworm的14.x版本),创建编译目录:
git clone --branch release/14.x https://github.com/llvm/llvm-project.git cd llvm-project && mkdir build && cd build - 配置编译选项,禁用stacktrace支持:
cmake ../libcxx -DCMAKE_INSTALL_PREFIX=/opt/libcxx-no-stacktrace \ -DCMAKE_C_COMPILER=clang-14 -DCMAKE_CXX_COMPILER=clang++-14 \ -DLIBCXX_ENABLE_STACKTRACE=OFF - 编译并安装:
make -j$(nproc) && make install - 现在可以正常安装libunwind8-dev,编译代码时使用自定义的libc++:
clang++ your_code.cpp -stdlib=libc++ -I/opt/libcxx-no-stacktrace/include/c++/v1 \ -L/opt/libcxx-no-stacktrace/lib -Wl,-rpath=/opt/libcxx-no-stacktrace/lib -lunwind
方案3:使用环境隔离工具
如果上述方法过于繁琐,可以用chroot或者多阶段容器构建,分别在不同环境编译依赖libunwind8和libc的模块,最后链接到一起。比如在Bullseye容器编译libunwind8相关的静态库,再拷贝到Bookworm容器里和libc代码链接。
内容的提问来源于stack exchange,提问作者kuga
相关产品推荐
相关产品推荐

