How to create a static library in Rust to communicate with C code in Windows?

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 a static lib in Rust and link the library to main.c. My active toolchain stable-i686-pc-windows-gnu. I do this in cmd:

rustc --crate-type=staticlib func.rs 

But the func.lib file is created , so I:

gcc -o myprog main.c func.lib -lgcc_eh -lshell32 -luserenv -lws2_32 -ladvapi32

But I get an error message:

undefined reference to __ms_vsnprintf'

If I do this:

rustc --crate-type=staticlib --target=i686-unknown-linux-gnu lib.rs

Then libfunc.a is created , but when I do this:

gcc -o myprog main.c libfunc.a

I get an error message:

main.c:(.text+0x1e): undefined reference to `double_input'

What am I doing wrong?

+7
source share
1 answer

TL DR: Set a different taste for GCC

pacman -R local/gcc
pacman -S mingw-w64-i686-gcc

A semi-conscious assumption follows ...

Rust IRC, , , MSYS2/MinGW gcc "", MSYS/MinGW/Windows.

mingw-w64-i686-gcc ( mingw-w64-x86_64-gcc) , Windows, libbacktrace, Rust.

"" GCC "Built by MSYS2 project" gcc --version.


:

$ rustc --version --verbose
rustc 1.17.0 (56124baa9 2017-04-24)
host: i686-pc-windows-gnu
$ gcc --version
gcc.exe (Rev2, Built by MSYS2 project) 6.3.0

$ rustc --crate-type=staticlib func.rs
note: link against the following native artifacts when linking against this static library
note: the order and any duplication can be significant on some platforms, and so may need to be preserved
note: library: advapi32
note: library: ws2_32
note: library: userenv
note: library: shell32
note: library: gcc_eh
$ gcc -o main main.c func.lib -ladvapi32 -lws2_32 -luserenv -lshell32 -lgcc_eh
$ ./main
4 * 2 = 8
+4

Source: https://habr.com/ru/post/1017103/


All Articles