为Musl目标链接Rust静态库时,如何修复GLIBC 2.4符号未定义引用?
交叉编译Rust静态库链接C++程序时的链接错误
问题背景
在Musl目标环境下,通过cbindgen将Rust库与C程序结合,使用cross工具进行交叉编译。Rust库编译成功,但构建C程序时出现链接错误。
链接错误详情
/mnt/HDD/Project/inkbox-build/inkbox/compiled-binaries/arm-kobo-linux-gnueabihf/bin/../lib/gcc/arm-kobo-linux-gnueabihf/11.2.0/../../../../arm-kobo-linux-gnueabihf/bin/ld.bfd: /mnt/HDD/Project/inkbox-build/inkbox/inkbox-toreader/libs/Libretranslate-rs-to-cpp/lib//libLibretranslate_rs_to_cpp.a(Libretranslate_rs_to_cpp-da46da90a85dac4d.Libretranslate_rs_to_cpp.a677ed00b91c84d4-cgu.0.rcgu.o): in function `rust_eh_personality': /rustc/03a119b0b0e310d22d94399b24ed030056050f13/library/std/src/sys/personality/gcc.rs:99: multiple definition of `rust_eh_personality'; /mnt/HDD/Project/inkbox-build/inkbox/inkbox-toreader/libs/libreader-rs/lib//libreader_rs.a(reader_rs-08f466727572406f.reader_rs.16ecb517c7176846-cgu.0.rcgu.o):/rustc/03a119b0b0e310d22d94399b24ed030056050f13/library/std/src/sys/personality/gcc.rs:99: first defined here /mnt/HDD/Project/inkbox-build/inkbox/compiled-binaries/arm-kobo-linux-gnueabihf/bin/../lib/gcc/arm-kobo-linux-gnueabihf/11.2.0/../../../../arm-kobo-linux-gnueabihf/bin/ld.bfd: /mnt/HDD/Project/inkbox-build/inkbox/inkbox-toreader/libs/Libretranslate-rs-to-cpp/lib//libLibretranslate_rs_to_cpp.a(Libretranslate_rs_to_cpp-da46da90a85dac4d.Libretranslate_rs_to_cpp.a677ed00b91c84d4-cgu.0.rcgu.o): undefined reference to symbol 'clock_gettime@@GLIBC_2.4' /mnt/HDD/Project/inkbox-build/inkbox/compiled-binaries/arm-kobo-linux-gnueabihf/bin/../lib/gcc/arm-kobo-linux-gnueabihf/11.2.0/../../../../arm-kobo-linux-gnueabihf/bin/ld.bfd: /home/build/inkbox/compiled-binaries/arm-kobo-linux-gnueabihf/arm-kobo-linux-gnueabihf/sysroot//lib/librt.so.1: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status
依赖与过往解决情况
此前第一个Rust库遇到过类似GLIBC相关问题,当时是因为设置了[lib] crate-type = ["rlib"],后来改为仅保留"staticlib"以静态方式链接库后解决。但当前Rust库引入了更多依赖:
futures = "0.3" futures-executor = { version = "0.3", features = ["thread-pool"] } libretranslate = { path = "lib-rs/libretranslate-rs" } openssl = { version = '0.10', features = ["vendored"] }
额外信息
- Rust库的readelf输出(Debug构建,大小250Mb)
- Rust库代码仓库
- 待链接的C++程序仓库
已尝试的方法
调整过[lib]选项及crate类型,但问题仍未解决,目前没有可行思路。
内容的提问来源于stack exchange,提问作者Szybet
相关产品推荐
相关产品推荐

