我正在尝试将一些可执行文件(使用 gcc 编译(与使用cargo build
编译的库链接。
cargo 从用 Rust 语言编写的代码生成 .a 和 .so 库。
链接错误为:
/sharedhome/maxaxe01/mbed-cloud-client-example-internal/mbed-cloud-client/parsec-se-driver/target/debug/libparsec_tpm_direct_se_driver.a(compiler_builtins-2541f1e09df1c67d.compiler_builtins.dh9snxly-cgu.0.rcgu.o): In function `__udivti3':
/cargo/registry/src/github.com-1ecc6299db9ec823/compiler_builtins-0.1.25/src/int/udiv.rs:247: multiple definition of `__udivti3'
/usr/lib/gcc/x86_64-linux-gnu/7/libgcc.a(_udivdi3.o):(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
据我了解,在我的libgcc和RUST系统库中,一些低级处理器数学函数定义了两次的问题compiler_builtins-0.1.25/src/int/udiv.rs可能是有人知道如何解决这个问题?
如果我将可执行文件与库作为共享对象链接,它已成功链接,但我需要使用静态库进行编译!(货物构建生成 .so 和 .a(
这个线程("将 Rust staticlib 与嵌入式 C 程序链接时'memcmp'的多重定义错误(对我没有帮助。
如果函数的两个版本__udivti3
等效,您可以尝试将程序与-Wl,--allow-multiple-definition
链接。这显然是一个丑陋的黑客,我有兴趣获得适当的解决方案,但它对我有用。我在compiler-builtins
箱(标准库的一部分(和 LLVMlibc++
的静态版本之间的__muloti4
上遇到了类似的冲突。
显然,我假设使用cdylib
不适合您,并且您的 Rust 库需要是静态的。