解决使用Rust与Sqlite3交互时出现LNK1181错误(Diesel 或 rusqlite)

现象

在Windows环境下msvc工具链(GUN也有可能,但错误代码不一样)编译Rust,使用rusqlite的过程中(比如Rocket等Web框架),仅仅安装sqlite再加入PATH环境变量是不够的。在这种情况下会报错:

error: linking with `link.exe` failed: exit code: 1181 | = note: "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.28.29333\\bin\\HostX64\\x64\\link.exe" "/NOLOGO" "/NXCOMPAT" "/LIBPATH:C:\\Users\\*****\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib" "C:\\Users\\*****\\Desktop\\project\\target\\release\\deps\\project.project.70as1cim-cgu.0.rcgu.o" "/OUT:C:\\Users\\*****\\Desktop\\project\\target\\release\\deps\\project.exe" "/OPT:REF,ICF" "/DEBUG" "/NATVIS:C:\\Users\\*****\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\etc\\intrinsic.natvis" "/NATVIS:C:\\Users\\*****\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\etc\\liballoc.natvis" "/NATVIS:C:\\Users\\*****\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\etc\\libcore.natvis" "/NATVIS:C:\\Users\\*****\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\etc\\libstd.natvis" "/LIBPATH:C:\\Users\\*****\\Desktop\\project\\target\\release\\deps" "/LIBPATH:C:\\SQLite" "/LIBPATH:C:\\Users\\*****\\Desktop\\project\\target\\release\\build\\rust-crypto-6175a33ab1c8182c\\out" "/LIBPATH:C:\\Users\\*****\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib" "C:\\Users\\*****\\AppData\\Local\\Temp\\rustcvWTbYn\\libcrypto-85638adcb4e6287b.rlib" "C:\\Users\\*****\\.rustup\\toolchains\\nightly-x86_64-pc-windows-msvc\\lib\\rustlib\\x86_64-pc-windows-msvc\\lib\\libcompiler_builtins-558737ae27bfd2fc.rlib" "sqlite3.lib" "advapi32.lib" "advapi32.lib" "cfgmgr32.lib" "credui.lib" "fwpuclnt.lib" "gdi32.lib" "kernel32.lib" "msimg32.lib" "ntdll.lib" "opengl32.lib" "secur32.lib" "synchronization.lib" "user32.lib" "winspool.lib" "ws2_32.lib" "advapi32.lib" "ws2_32.lib" "userenv.lib" "msvcrt.lib" = note: Non-UTF-8 output: LINK : fatal error LNK1181: \xce\xde\xb7\xa8\xb4\xf2\xbf\xaa\xca\xe4\xc8\xeb\xce\xc4\xbc\xfe\xa1\xb0sqlite3.lib\xa1\xb1\r\n
Code language: JavaScript (javascript)

导致 Cargo 或 Rustc 无法编译。

排查

首先排查是否可能是没有安装 Visual Studio 2019 (或其它类似版本 2015 2017 2019 等)的 C++ 组件。其中,必须安装的是 MSVC 和 Windows SDK。只安装前者可能导致部分编译错误。当然,一般人都正确安装了。

重中之重是查看是否编译了 sqlite3.lib 文件。需要注意的是,在 Sqlite3 官方下载的 Windows 二进制文件中,是不含有 sqlite3.lib 文件的,因此我们需要单独编译。

解决

下面说明如何在Windows环境下编译生成sqlite3.lib 文件:

  1. Sqlite官网(https://www.sqlite.org/download.html)下载源码的 amalgamation 压缩包和二进制文件 Precompiled Binaries for Windows ,其中二进制文件需要下载 dll 和 tools 两个包;
  2. 将三个压缩包的全部内容解压到同一目录/文件夹下
  3. 在Windows开始菜单,搜索“Developer Command Prompt”对应版本的 Developer Command Prompt ,如 Developer Command Prompt for VS 2019 或 VS 2017 并打开;
  4. cd 命令切换到源代码和二进制文件所在文件夹;
  5. 64位操作系统输入: lib /DEF:sqlite3.def /OUT:sqlite3.lib /MACHINE:x64;32位操作系统输入:lib /DEF:sqlite3.def /OUT:sqlite3.lib /MACHINE:x86,完成编译。编译输出sqlite3.lib文件可在目录下找到。

找到输出的sqlite3.lib 文件,将之放在想要运行的Rust项目的目录,即运行cargo run的目录下即可,抑或是将之加入PATH环境变量,重新编译后即可解决问题。

发表评论