我可以通过运行 vcvarsall.bat 从命令行进行编译,然后运行 cl.exe 并将我的源文件作为唯一参数。问题是只运行 cl.exe 而没有首先使用上述批处理文件设置环境会导致由于“缺少库”而导致的错误。
我可以想象一些解决方法,例如在我的项目目录中创建一个批处理文件,其中包含 vcvarsall.bat 并进行所有编译。不过,在我看来,这是一个非常麻烦且不灵活的解决方案。我更希望能够像在 Unix 中那样从 Vim 编译和运行任何 C 或 C++ 文件:
:nnorebind <F5> :! g++ %<CR>
我不想添加 vcvarsall.bat 永久添加到环境中的一堆路径。我不知道如何更好地表达我的问题:How do I set up Vim to able to use the Visual Studio 2010 C++ compiler?
你可以在 Vim 中更新环境变量。例如,要将“c: oo”添加到 PATH 的开头:
let $PATH='c:\\foo;'.$PATH
我将我的 vcvars*.bat 文件的相关部分复制到我的 vimrc 中:
if !exists("visual_studio_paths_added")
let visual_studio_paths_added = 1
let $PATH="C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\Common7\\IDE;C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\BIN;C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\Common7\\Tools;C:\\Windows\\Microsoft.NET\\Framework\\v3.5;C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727;C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\VCPackages;C:\\Program Files\\Microsoft SDKs\\Windows\\v6.0A\\bin;".$PATH
let $INCLUDE="C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\ATLMFC\\INCLUDE;C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\INCLUDE;C:\\Program Files\\Microsoft SDKs\\Windows\\v6.0A\\include;".$INCLUDE
let $LIB="C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\ATLMFC\\LIB;C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\LIB;C:\\Program Files\\Microsoft SDKs\\Windows\\v6.0A\\lib;".$LIB
let $LIBPATH="C:\\Windows\\Microsoft.NET\\Framework\\v3.5;C:\\Windows\\Microsoft.NET\\Framework\\v2.0.50727;C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\ATLMFC\\LIB;C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\LIB;".$LIBPATH
endif
根据您的 Visual Studio 版本和安装目录进行调整。
在我的例子中,我把它放在一个函数中。当我想使用 Visual Studio 时,我会调用
:vcvars
。但是您可以始终包含这些更改。
扩展 David Rodríguez - dribeas 的评论,看看
vcvarsall.bat
是如何接受参数的,我发现在我的源代码树中包含以下文件很有帮助:
vc.bat
:
call "%VS100COMNTOOLS%\..\..\VC\vcvarsall.bat" amd64 & %*
根据需要调整MSVS版本和平台,或者根据需要为其添加附加参数。
%VS...COMNTOOLS%
环境变量由 MSVC 安装程序设置,这使得上述与实际安装路径无关。
这允许我在适当的 MSVC 环境中运行任何
<command>
,方法是将其运行为:
vc.bat <command>
如果不带参数调用,它只会为当前 shell 设置环境,而不执行任何进一步的命令。
如果您想更进一步,可以使用 CMake,这是一个元构建系统,允许您从单个(CMake 语法)配置生成 Unix Makefile、MSVC 解决方案和其他几种构建文件类型。 Windows 支持的构建文件类型之一是 NMake Makefiles... 和
nmake <target>
在 Windows 上的处理与 make <target>
在 Unix 上的处理一样好。
你可以使用插件vcvars.vim来设置环境变量。
在 Neovim 中,使用 lazy.nvim 作为包管理器,可以通过 vcvars.vim 设置环境变量
{
"hattya/vcvars.vim",
event = "VeryLazy",
config = function()
vim.cmd([[
let vcvars_dict = vcvars#get(vcvars#list()[-1])
let $PATH = join(vcvars_dict.path, ';') .';'. $PATH
let $INCLUDE = join(vcvars_dict.include, ';') .';'. $INCLUDE
let $LIB = join(vcvars_dict.lib, ';') .';'. $LIB
let $LIBPATH = join(vcvars_dict.libpath, ';') .';'. $LIBPATH
]])
end,
},
Mud 的解决方案不适用于 Visual Studio 2017 Community。路径不同。我认为 DevSolar 使用 vcvarsall.bat 的方式更可靠,因为它让 VS 处理正确的路径。
因为我不想在我的 vim 配置中携带 .bat 文件,所以我一直在寻找一个只在 .vimrc 中工作的解决方案:
c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
.将以下内容放入您的 .vimrc 以通过 F8 编译当前文件
nnoremap <F8> :!vcvarsall.bat && cl /EHsc % <CR>