交叉编译libunwind时缺失共享库的问题求助
问题
尝试使用以下命令将libunwind交叉编译至aarch64架构:
./configure --prefix=/home/test/libunwind/arm_build --libdir=/home/test/libunwind/arm_build/lib --target=aarch64 --host=x86_64 CC=/home/gcc-10.3/bin/aarch64-none-linux-gnu-gcc CXX=arm-none-linux-gnu-g++ LDFLAGS="-L$PWD/src/.libs" --enable-shared=yes
但编译后仅生成静态库及头文件,目录结构如下:
~/libunwind » tree arm_build arm_build ├── include │ ├── libunwind-aarch64.h │ ├── libunwind-common.h │ ├── libunwind-coredump.h │ ├── libunwind-dynamic.h │ ├── libunwind-ptrace.h │ └── libunwind-x86.h └── lib ├── libunwind-aarch64.a ├── libunwind-aarch64.la ├── libunwind-x86.a ├── libunwind-x86.la └── pkgconfig ├── libunwind-coredump.pc ├── libunwind-generic.pc └── libunwind-ptrace.pc 3 directories, 13 files
而在原生x86架构编译时(命令为./configure --prefix=/home/test/libunwind/x86_build ),能正常生成共享库,目录结构片段如下:
~/libunwind » tree x86_build x86_build ├── include │ ├── libunwind-common.h │ ├── libunwind-coredump.h │ ├── libunwind-dynamic.h │ ├── libunwind.h │ ├── libunwind-ptrace.h │ ├── libunwind-x86_64.h │ └── unwind.h └── lib ├── libunwind.a ├── libunwind-coredump.a ├── libunwind-coredump.la ├── libunwind-coredump.so -> libunwind-coredump.so.0.0.0 ├── libunwind-coredump.so.0 -> libunwind-coredump.so.0.0.0 ├── libunwind-coredump.so.0.0.0 ├── libunwind-generic.a -> libunwind-x86_64.a ├── libunwind-generic.so -> libunwind-x86_64.so ├── libunwind.la ├── libunwind-ptrace.a ├── libunwind-ptrace.la ├── libunwind-ptrace.so -> libunwind-ptrace.so.0.0.0 ├── libunwind-ptrace.so.0 -> libunwind-ptrace.so.0.0.0 ├── libunwind-ptrace.so.0.0.0 ├── libunwind-setjmp.a ├── libunwind-setjmp.la ├── libunwind-setjmp.so -> libunwind-setjmp.so.0.0.0 ├── libunwind-setjmp.so.0 -> libunwind-setjmp.so.0.0.0 ├── libunwind-setjmp.so.0.0.0 ├── libunwind.so -> libunwind.so.8.0.1 ...
请问有什么方法可以在交叉编译时强制生成共享库?
解决方法
- 修复工具链参数不匹配:配置命令中
CC使用的是aarch64架构编译器,但CXX用的是arm架构的arm-none-linux-gnu-g++,两者架构不匹配会导致链接异常。将CXX替换为对应aarch64版本的编译器,比如/home/gcc-10.3/bin/aarch64-none-linux-gnu-g++。 - 修正交叉编译架构参数:交叉编译时,
--host应设置为目标架构,原命令中--host=x86_64错误,会让configure认为是编译x86_64版本的库。修改为--host=aarch64-none-linux-gnu,--target参数可省略或设为相同值。 - 移除干扰性LDFLAGS:配置阶段添加的
LDFLAGS="-L$PWD/src/.libs"可能干扰交叉编译的链接路径,建议先移除该参数,确认共享库正常生成后再按需添加。 - 强制仅生成共享库:在configure命令中添加
--disable-static,配合--enable-shared=yes,强制跳过静态库编译,只生成共享库。 - 清理后重新编译:先执行
make clean删除旧编译产物,再删除arm_build目录和config.cache文件,用修正后的命令重新执行configure && make && make install。 - 升级libunwind版本:部分旧版本libunwind对aarch64交叉编译的共享库支持不完善,建议升级到最新稳定版本后再尝试编译。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

