2017-03-24 16 views
0

Windowsでvsnprintfを呼び出すRustコードをコンパイルしようとしています。私のCコードは次のようになります。Windowsでvsnprintfを呼び出すCコードを呼び出すRustコード

#include <stdarg.h> 
#include <stdio.h> 

// A static buffer for storing any formatted messages. 
static char buffer[4096]; 

void rust_logger(const char *fmt, ...) { 
    // Reconstruct the variable arguments as a va_list. This is necessary so we 
    // can chain together a call to vsnprintf. 
    va_list varargs; 
    va_start(varargs, fmt); 

    // Write the formatted string to our target (static) buffer. 
    vsnprintf(buffer, sizeof(buffer)-1, fmt, varargs); 

    // Call Rust back with final string 
    ... 

    // Clean up processing of variable arguments 
    va_end(varargs); 
} 

これはMacOS上でうまく動作します(Linuxでは、私は試していませんが)。しかし、Windowsでは、私は問題を抱えています。私が手にエラーがある:私の研究から

"C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\bin\\amd64\\link.exe" "/LIBPATH:C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\lib\\amd64" "/LIBPATH:C:\\Program Files (x86)\\Windows Kits\\10\\lib\\10.0.10240.0\\ucrt\\x64" "/LIBPATH:C:\\Program Files (x86)\\Windows Kits\\8.1\\lib\\winv6.3\\um\\x64" "/NOLOGO" "/NXCOMPAT" "/LIBPATH:C:\\Users\\mtiller\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib" "C:\\Users\\mtiller\\Source\\rust-fmu\\target\\debug\\deps\\rust_fmu-dd167e2c1e3583f1.0.o" "/OUT:C:\\Users\\mtiller\\Source\\rust-fmu\\target\\debug\\deps\\rust_fmu-dd167e2c1e3583f1.exe" "/OPT:REF,NOICF" "/DEBUG" "/LIBPATH:C:\\Users\\mtiller\\Source\\rust-fmu\\target\\debug\\deps" "/LIBPATH:C:\\Users\\mtiller\\Source\\rust-fmu\\target\\debug\\build\\rust-fmu-e434516f4288772d\\out" "/LIBPATH:C:\\Users\\mtiller\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib" "logger.lib" "C:\\Users\\mtiller\\Source\\rust-fmu\\target\\debug\\deps\\liblibloading-c41a2f71457b39f3.rlib" "C:\\Users\\mtiller\\Source\\rust-fmu\\target\\debug\\deps\\liblibc-5dc7b85e748840b4.rlib" "C:\\Users\\mtiller\\Source\\rust-fmu\\target\\debug\\deps\\libkernel32-835ed4d4f4dc2d3e.rlib" "C:\\Users\\mtiller\\Source\\rust-fmu\\target\\debug\\deps\\libwinapi-a5898d7aceb63fac.rlib" "C:\\Users\\mtiller\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib\\libstd-90fbcc8c07b4a644.rlib" "C:\\Users\\mtiller\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib\\libpanic_unwind-d2e7baf2c0a36eaf.rlib" "C:\\Users\\mtiller\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib\\libunwind-112baa0117a60076.rlib" "C:\\Users\\mtiller\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib\\liblibc-ad15457034b2bf37.rlib" "C:\\Users\\mtiller\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib\\librand-fa1852079e0fefd1.rlib" "C:\\Users\\mtiller\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib\\libcollections-27e4c8cc19e6faac.rlib" "C:\\Users\\mtiller\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib\\liballoc-588bb0bd8c9dd8ca.rlib" "C:\\Users\\mtiller\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib\\liballoc_system-dbfe715efb71d408.rlib" "C:\\Users\\mtiller\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib\\libstd_unicode-a2e15800b52a7a60.rlib" "C:\\Users\\mtiller\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib\\libcore-b2880fdfb9b2b596.rlib" "C:\\Users\\mtiller\\.rustup\\toolchains\\stable-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib\\libcompiler_builtins-9d27746f5ba8488f.rlib" "kernel32.lib" "advapi32.lib" "ws2_32.lib" "userenv.lib" "shell32.lib" "msvcrt.lib" 
note: logger.lib(logger.o) : error LNK2019: unresolved external symbol __ms_vsnprintf referenced in function vsnprintf 
      C:\Users\mtiller\Source\rust-fmu\target\debug\deps\rust_fmu-dd167e2c1e3583f1.exe : fatal error LNK1120: 1 unresolved externals 

これはMinGWのとにMinGW64の間にいくつかの不一致とは何かを持っているように、それはそうですが、私は錆のビルドの出力を見ると、それが使用しているようですVisual Studio 14.0。

私は完全に混乱しています。私はRustがどのツールチェーンを使用するかを決定する方法はよく分かりません。私はrustup-init.exeのインストーラを使用していましたが、「正しいことをやる」と思っていましたが、ここで混乱しているようです(それは私だけです)。

私のツールチェーンをどのように整列させるための提案はありますか?私のプログラムがDLLをロードしているので、libloadingを使用しています。私はその部分もうまくいきたいが、ビルドの問題のためにまだWindowsの下でそれをテストすることを得ていない。

P.S. - vsnprintfvバージョンが必要です。なぜなら、私はvarargsを渡しているから、実際にそれらを処理する方法が必要だからです。

+1

錆は使用するツールチェーンを「決定」しません。あなたがやる。 MSVCツールチェーンまたはGNUツールチェーンを使用するRustのバージョンをインストールすることを選択すると、 'rustc -v --verbose'を実行することでどれを持っているのかを知ることができます。 – Shepmaster

+1

問題を再現するのに十分な情報を提供していません。 [MCVE]の作成方法を確認してください(*最小*と*確認可能*に特に注意してください)。たとえば、Cコードがどのようにコンパイルまたはリンクされているか、それを呼び出すRustコードは表示されません。 – Shepmaster

+0

あなたは 'rustc -v --verbose'を書いていますが、' rustc -V --verbose'を意味すると仮定します。つまり、私は 'x86_64-pc-windows-msvc'を使っています。だから私はMinGWに関連するように思われるこのエラーが出ているのは奇妙です。しかし、少なくとも今、私はそれがどのホストを使用しているかを知っています。そこから問題を解決します。確かに、これは私のコンピュータにインストールされているツールと関係があると確信しているので、ここで検証可能なケースを提供するのは難しいです。 –

答えて

0

私のマシンには、MSVC、MinGW64、MinGWがインストールされていました。エラーメッセージが表示されたとき、私のパス上の問題や自分のマシン上のツールに関する自分の前提のために、間違ったコンパイラ/リンカーを呼び出すことがrustcに関連していると思っていました。

私が使用していたビルドスクリプトは、gccarを直接呼び出すもので、MinGWコマンドを呼び出すことが判明しました。私はRustがこれらのコマンドのための「ラッパー」を持っていると考えていたので、すべてのプラットフォームで同じように動作しました(したがって、これらについての心配はありません)。

私はより密接にを読むと、彼らは同じ(移植性のない)アプローチを繰り返していますが、そのアプローチのクロスプラットフォームサポートの欠如について話し、はるかに単純でより移植性のある方法を示しますこれをする。

ボトムライン、使用:

[build-dependencies] 
gcc = "0.3" 

...と慎重にビルドスクリプトのドキュメントを参照してください。今はすべてmacOSとWindowsの両方でうまくコンパイルされます。

関連する問題