windows - 无法编译调用在 Windows 上调用 vsnprintf 的 C 代码的 Rust 代码

标签 windows rust rust-cargo

我正在尝试在调用 vsnprintf 的 Windows 上编译 Rust 代码。我的 C 代码如下所示:

#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 之间的某些不匹配有关,但是当我查看 Rust 构建的输出时,它似乎使用的是 Visual Studio 14.0。

我完全糊涂了。我不太清楚 Rust 如何确定使用哪个工具链。我使用了 rustup-init.exe 安装程序,我认为它会“做正确的事”,但它在这里似乎很困惑(或者只是我)。

关于如何使我的工具链保持一致有什么建议吗?另一个约束是我正在使用 libloading crate,因为我的程序正在加载 DLL。我希望该部分也能正常工作,但由于构建问题,尚未在 Windows 下进行测试。

附言- 我需要 vsnprintfv 版本,因为我正在传递可变参数,我需要一种方法来实际处理它们。

最佳答案

我的机器上安装了 MSVC、MinGW64 和 MinGW。鉴于错误消息,我陷入了一个陷阱,认为它与 rustc 调用错误的编译器/链接器有关,因为我的路径存在问题或它自己对我机器上的工具的假设。

原来我使用的构建脚本直接调用了 gccar,它们调用了 MinGW 命令。我认为 Rust 为这些命令提供了“包装器”,因此它们在所有平台上的行为都相同(因此我不关心这些)。

当我阅读 documentation on build scripts更仔细地说,我看到他们重复了相同的(不可移植的)方法,但随后又谈到该方法缺乏跨平台支持,然后展示了一种更简单、更便携的方法来做到这一点。

底线,使用:

[build-dependencies]
gcc = "0.3"

...并仔细阅读构建脚本文档。现在一切都可以在 macOS 和 Windows 上正常编译。

关于windows - 无法编译调用在 Windows 上调用 vsnprintf 的 C 代码的 Rust 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42990101/

相关文章:

java - Windows 批处理文件 popd 无法按预期工作

windows - CD到目录,路径在文件中

rust - 为什么不更新const原子变量,而更新静态原子变量?

rust - 具有来自同一 git 存储库的冲突功能的 cargo 构建包?

rust - 在没有 tokio 的情况下使用 rust-s3?

windows - SVN授权失败

c - 在Windows上使用C语言读取硬盘上的特定扇区

rust - 在 Rust 的结构中查找最常出现的字符串?

rust - 将异步函数传递给另一段代码(无法满足编译器的要求)

rust - "manifest path is a virtual manifest, but this command requires running against an actual package"是什么意思?