I have 2 files:
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;
}
I want to create static lib in Rust and link the library to main.c. My active toolchain is stable-i686-pc-windows-gnu
. I'm doing this in cmd:
rustc --crate-type=staticlib func.rs
But the file func.lib is created, so I do:
gcc -o myprog main.c func.lib -lgcc_eh -lshell32 -luserenv -lws2_32 -ladvapi32
But I get an error:
undefined reference to __ms_vsnprintf'
If I do:
rustc --crate-type=staticlib --target=i686-unknown-linux-gnu lib.rs
Then libfunc.a is created, but when I do:
gcc -o myprog main.c libfunc.a
I get an error:
main.c:(.text+0x1e): undefined reference to `double_input'
What am I doing wrong?
TL;DR: Install a different flavor of GCC
Half-informed guessing follows...
After some help on Rust IRC, it sounds like the issue is that the MSYS2 / MinGW
gcc
is a "stock" compiler, one without special knowledge of MSYS / MinGW / Windows special features.mingw-w64-i686-gcc
(ormingw-w64-x86_64-gcc
) does know about Windows-specific symbols, which libbacktrace, a part of the Rust distribution, requires.The "correct" GCC build should have the string "Built by MSYS2 project" in the
gcc --version
output.With that, the full process looks like: