【发布时间】:2017-10-07 14:19:10
【问题描述】:
我有 2 个文件:
func.rs
#[no_mangle]
pub extern fn double_input(input: i32) -> i32 { input * 2 }
main.c
#include <stdint.h>
#include <stdio.h>
extern int32_t double_input(int32_t input);
int main() {
int input = 4;
int output = double_input(input);
printf("%d * 2 = %d\n", input, output);
return 0;
}
我想在 Rust 中创建静态库并将库链接到 main.c。我的活动工具链是stable-i686-pc-windows-gnu。我在 cmd 中这样做:
rustc --crate-type=staticlib func.rs
但文件 func.lib 已创建,所以我这样做了:
gcc -o myprog main.c func.lib -lgcc_eh -lshell32 -luserenv -lws2_32 -ladvapi32
但我得到一个错误:
undefined reference to __ms_vsnprintf'
如果我这样做:
rustc --crate-type=staticlib --target=i686-unknown-linux-gnu lib.rs
然后创建 libfunc.a,但是当我这样做时:
gcc -o myprog main.c libfunc.a
我得到一个错误:
main.c:(.text+0x1e): undefined reference to `double_input'
我做错了什么?
【问题讨论】:
-
gcc -o myprog main.c libfunc.a--->gcc -lfunc.a main.c -o myprog -
如果你使用
gcc -o myprog main.c func.lib会发生什么?您在 Windows 上执行所有这些操作,对 - 为什么不在可执行文件上添加 .exe 扩展名? -
@immibis
--target=i686-unknown-linux-gnu我不认为它在 Windows 上。 -
那么“我的活动工具链:stable-i686-pc-windows-gnu”——你为什么在 Linux 上使用 Windows 工具链?你想交叉编译吗?
-
@immibis 我尝试在 Linux 中使用 i686-unknown-linux-gnu。如果我使用:
gcc -o myprog main.c func.lib,那么我会使用:gcc -o myprog main.c func.lib -lgcc_eh -lshell32 -luserenv -lws2_32 -ladvapi32但我得到一个错误:undefined reference to __ms_vsnprintf'