我一直在尝试编译和运行从 C 调用 Rust 函数的最小示例。但是,我一直收到链接器错误:
$ gcc -L . test.c -ltest
C:\Users\...\AppData\Local\Temp\ccWuOBbj.o:test.c:(.text+0x16): undefined reference to `squared'
collect2.exe: error: ld returned 1 exit status
C 代码:
#include <stdio.h>
int squared(int);
int main() {
printf("5 * 5 = %d", squared(5));
return 0;
}
Rust 代码:
#![no_std]
#![feature(lang_items)]
extern crate core;
#[lang = "stack_exhausted"] extern fn stack_exhausted() {}
#[lang = "eh_personality"] extern fn eh_personality() {}
#[lang = "panic_fmt"] fn panic_fmt() -> ! { loop {} }
#[no_mangle]
pub extern "C" fn squared(x: isize) -> isize {
x * x
}
我正在使用 rustc --crate-type staticlib -o libtest.a test.rs
编译 Rust 代码
一些细节:
将“-ltest”放在“test.c”之后。 ld 只链接库文件的必需部分,并且不知道 squared() 是必需的,直到它看到从 test.c 生成的 .o 文件,此时 libtest.a 已经在还不需要函数时更早链接从它。
我是一名优秀的程序员,十分优秀!