How do I create a static library in Rust to link with C code in Windows?

前端 未结 1 612
时光说笑
时光说笑 2021-01-04 17:42

I have 2 files:

func.rs

#[no_mangle]
pub extern fn double_input(input: i32) -> i32 { inp         


        
相关标签:
1条回答
  • 2021-01-04 18:11

    TL;DR: Install a different flavor of GCC

    pacman -R local/gcc
    pacman -S mingw-w64-i686-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 (or mingw-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:

    $ 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
    
    0 讨论(0)
提交回复
热议问题