【发布时间】:2017-08-16 20:05:23
【问题描述】:
我正在尝试在 Windows 上编译调用 vsnprintf 的 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 下对其进行测试。
附: - 我需要vsnprintf 的v 版本,因为我正在传递可变参数,我需要一种方法来实际处理它们。
【问题讨论】:
-
Rust 不会“确定”要使用的工具链;你做。您选择安装使用 MSVC 工具链或 GNU 工具链的 Rust 版本,您可以通过运行
rustc -v --verbose来判断您拥有的版本。 -
您没有提供足够的信息来重现您的问题。请查看如何创建minimal reproducible example(特别注意minimal 和verifiable)。例如,你没有展示 C 代码是如何被编译或链接的,或者是调用它的 Rust 代码。
-
你写了
rustc -v --verbose,但我认为你的意思是rustc -V --verbose。那就是说我正在使用x86_64-pc-windows-msvc。所以奇怪的是,我收到了这个似乎与 MinGW 相关的错误。但至少现在我知道它使用的是什么主机。我会从那里解决问题。在这里很难提供一个可验证的案例,因为我很确定这与我计算机上安装的工具有关。 -
你说 Rust 没有“决定”工具链。请注意,Rustup 安装说明说“尽管是针对 GNU 工具链构建的,但如果 rustup 的 Windows 版本检测到已安装 MSVC,它将为 MSVC 工具链安装 Rust。”这就是我所指的。
-
是的,我试图做到精确(但做得不好)。 Rust 编译器 不决定使用哪个工具链。如果你没有指定,Rustup 会选择一个特定于工具链的编译器版本来为你安装,但是围绕编译器构建的工具并不是 Rust 本身。即使您无法提供可验证的示例,您也可以使用其他信息进行更新,社区可以尽我们所能提供帮助。例如,如果您使用 MinGW 工具链将 C 代码编译为对象,那将是一个关键因素。
标签: windows rust rust-cargo