我大量使用Cygwin(与PuTTY shell)。但是,在Cygwin Bash shell中调用cl.exe
(即Visual C++编译器工具链)是相当棘手的。在Bash shell中运行vcvars*.bat
不起作用。我试图将VC++的环境变量迁移到Cygwin,但并不那么容易。在Cygwin shell中调用cl.exe(MSVC编译器)
如何在Cygwin的Bash shell中运行VC++编译器?
我大量使用Cygwin(与PuTTY shell)。但是,在Cygwin Bash shell中调用cl.exe
(即Visual C++编译器工具链)是相当棘手的。在Bash shell中运行vcvars*.bat
不起作用。我试图将VC++的环境变量迁移到Cygwin,但并不那么容易。在Cygwin shell中调用cl.exe(MSVC编译器)
如何在Cygwin的Bash shell中运行VC++编译器?
我明白你的问题是将vcvars32.bat转换成shell脚本。
解决此问题的一种方法是基于这样的想法,即当一个进程启动另一个进程时,会继承环境变量。所以你可以简单地在cmd下运行vcvars32,然后运行bash。这工作正常,我的机器上:
sh-3.2$ cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
或者,运行前设置和CMD下调用vcvars32,然后后创建一个shell脚本来设置环境变量。
如果你不想总是在cygwin启动时使用特定版本的MSC,或者每次这个简单的选项都不是最好的时候不想使用它。 – 2016-11-08 09:12:25
另一种替代方法是打开vcvars32.bat(或vsvars32.bat,在最新版本的Visual Studio中执行实际工作),查看它的功能,然后在适当的shell脚本中复制它。
它并不特别复杂 - 它所做的就是设置一堆环境变量。
我已将我的vsvars32.bat
文件转换为我的visual_studio.env
文件。当我需要使用命令行Visual Studio的环境时,我只是做这个文件的来源。
在sh
shell环境,在我将它们与cygpath -au
或cygpath -aup commands
然后我把它们写下来到我.env
文件翻译,并将它们与cygpath -aw
或背部翻译我不能注册Windows路径(\
和;
冲突与sh
),所以 cygpath -aup commands
。
我visual_studio.env
文件是这样的:
VS80COMNTOOLS=$(cygpath -aw '/cygdrive/c/Programmi/Microsoft Visual Studio 8/Common7/Tools/'); export VS80COMNTOOLS
VSINSTALLDIR=$(cygpath -aw '/cygdrive/c/Programmi/Microsoft Visual Studio 8'); export VSINSTALLDIR
VCINSTALLDIR=$(cygpath -aw '/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC'); export VCINSTALLDIR
FrameworkDir=$(cygpath -aw '/cygdrive/c/WINDOWS/Microsoft.NET/Framework'); export FrameworkDir
FrameworkVersion='v2.0.50727'; export FrameworkVersion
FrameworkSDKDir=$(cygpath -aw '/cygdrive/c/Programmi/Microsoft Visual Studio 8/SDK/v2.0'); export FrameworkSDKDir
echo Setting environment for using Microsoft Visual Studio 2005 x86 tools.
DevEnvDir=$(cygpath -aw '/cygdrive/c/Programmi/Microsoft Visual Studio 8/Common7/IDE'); export DevEnvDir
PATH='/cygdrive/c/Programmi/Microsoft Visual Studio 8/Common7/IDE:/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/BIN:/cygdrive/c/Programmi/Microsoft Visual Studio 8/Common7/Tools:/cygdrive/c/Programmi/Microsoft Visual Studio 8/Common7/Tools/bin:/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/PlatformSDK/bin:/cygdrive/c/Programmi/Microsoft Visual Studio 8/SDK/v2.0/bin:/cygdrive/c/WINDOWS/Microsoft.NET/Framework/v2.0.50727:/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/VCPackages':$PATH
INCLUDE=$(cygpath -awp '/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/ATLMFC/INCLUDE:/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/INCLUDE:/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/PlatformSDK/include:/cygdrive/c/Programmi/Microsoft Visual Studio 8/SDK/v2.0/include'); export INCLUDE
LIB=$(cygpath -awp '/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/ATLMFC/LIB:/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/LIB:/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/PlatformSDK/lib:/cygdrive/c/Programmi/Microsoft Visual Studio 8/SDK/v2.0/lib'); export LIB
LIBPATH=$(cygpath -awp '/cygdrive/c/WINDOWS/Microsoft.NET/Framework/v2.0.50727:/cygdrive/c/Programmi/Microsoft Visual Studio 8/VC/ATLMFC/LIB'); export LIBPATH
我希望这可以帮助你。 /cygwin/cygwin.bat:
我通常加入
call "%VS80COMNTOOLS%vsvars32.bat" >NUL:
至c解决这个问题。请注意,VS80COMNTOOLS变量非常有用,因为它为您提供了一种定位vsvars32.bat的万无一失(hm)方法。
另一种方法是这样的,它可以让你轻松的不同版本的工作室之间切换:
function run_with_bat()
{
batfile=$1; shift
tmpfile="$TMP/tmp$$.bat"
echo "@echo off" > $tmpfile
echo "call \"%$batfile%vsvars32.bat\" >NUL:" >> $tmpfile
echo "bash -c \"%*\"" >> $tmpfile
cmd /c `cygpath -m "$tmpfile"` "[email protected]"
status=$?
rm -f $tmpfile
return $status
}
function run_vs9()
{
run_with_bat VS90COMNTOOLS "[email protected]"
}
function run_vs8()
{
run_with_bat VS80COMNTOOLS "[email protected]"
}
现在你可以这样做:
$ run_vs8 cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
$ run_vs9 cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]
注意编译器版本。
对于Visual Studio 2008 - 调用“%VS90COMNTOOLS%vsvars32.bat” – 2012-06-28 10:47:42
我必须修改“echo call ...”这个“echo”调用\“%$ batfile%.. \\ .. \\ VC \\ vcvarsall.bat \“amd64> NUL:”>> $ tmpfile`来选择正确的编译器版本来构建x64代码。 – DigitalEye 2014-07-18 22:33:25
我改变了run_with_bat函数,只是第一行和这个:`cmd/c call“$ {!batfile} vsvars32.bat”\&\&bash -c“$ *”`对于没有临时文件需要的文件。原始版本给我带来了“Program Files(x86)”中的空间问题。 – contero 2015-01-09 06:52:10
我不能添加评论Diomidis's reply :(,所以不得不发布一个答案吧。 我对他的回答一致,但将是乏味做“打开命令提示符”,运行Visual Studio/vcvars32.bat
和然后运行Bash。如果你不操心弄乱你的环境,最好的办法是修改Cygwin.bat
并修改它看起来像这样:
@echo off
D:
chdir D:\cygwin\bin
"%VS71COMNTOOLS%\vsvars32.bat" && bash --login -i
替换环境变量VS71COMNTOOLS与你的机器上适当的东西。
无需打开命令提示符并手动运行Bash。我很喜欢这个解决方案:)。我无法给这个黑客的真正作者信用,因为我找不到他的文章的链接,对此抱歉!
对于我来说,在的.bash_profile工作:
"`cygpath -ua "$VS80COMNTOOLS/vsvars32.bat"`" > NUL
继建议在其他的答案,我做了我的bash的差异“套”结果与不MSVC变量,来到使用以下脚本重新安装Microsoft Visual C++ 2010 Express。我已经重构了一些将所有依赖于安装的部分放在顶部,所以希望这可以用于其他人。
# These lines will be installation-dependent.
export VSINSTALLDIR='C:\Program Files\Microsoft Visual Studio 10.0\'
export WindowsSdkDir='C:\Program Files\Microsoft SDKs\Windows\v7.0A\'
export FrameworkDir='C:\WINDOWS\Microsoft.NET\Framework\'
export FrameworkVersion=v4.0.30319
export Framework35Version=v3.5
# The following should be largely installation-independent.
export VCINSTALLDIR="$VSINSTALLDIR"'VC\'
export DevEnvDir="$VSINSTALLDIR"'Common7\IDE\'
export FrameworkDIR32="$FrameworkDir"
export FrameworkVersion32="$FrameworkVersion"
export INCLUDE="${VCINSTALLDIR}INCLUDE;${WindowsSdkDir}include;"
export LIB="${VCINSTALLDIR}LIB;${WindowsSdkDir}lib;"
export LIBPATH="${FrameworkDir}${FrameworkVersion};"
export LIBPATH="${LIBPATH}${FrameworkDir}${Framework35Version};"
export LIBPATH="${LIBPATH}${VCINSTALLDIR}LIB;"
c_VSINSTALLDIR=`cygpath -ua "$VSINSTALLDIR\\\\"`
c_WindowsSdkDir=`cygpath -ua "$WindowsSdkDir\\\\"`
c_FrameworkDir=`cygpath -ua "$FrameworkDir\\\\"`
export PATH="${c_WindowsSdkDir}bin:$PATH"
export PATH="${c_WindowsSdkDir}bin/NETFX 4.0 Tools:$PATH"
export PATH="${c_VSINSTALLDIR}VC/VCPackages:$PATH"
export PATH="${c_FrameworkDir}${Framework35Version}:$PATH"
export PATH="${c_FrameworkDir}${FrameworkVersion}:$PATH"
export PATH="${c_VSINSTALLDIR}Common7/Tools:$PATH"
export PATH="${c_VSINSTALLDIR}VC/BIN:$PATH"
export PATH="${c_VSINSTALLDIR}Common7/IDE/:$PATH"
一个工具,我发现了从cygwin环境下编译的东西用MSVC非常宝贵的是一个包装我在Coin 3D图书馆称为“wrapmsvc”源代码库,谁是二进制发现可以发现here。
该程序包装cl.exe并将指定的任何GCC参数转换为相应的cl.exe arg。它还使用cygwin API将文件路径从cygwin窗体(/cygdrive/c/temp/test.c)正确转换为实际文件路径(C:\ temp \ test.c)。
该源码花了我一会儿才找到上次,但它被称为“wrapmsvc.cpp”,所以如果您需要编译它,请查找该文件。如果你碰巧编译它,你会得到一些折旧警告/错误有关使用cygwin_conv_to_posix_path或cygwin_conv_to_win32_path的,做如下修改:
更改行:
(void)cygwin_conv_to_posix_path(s.c_str(), buf);
到
(void)cygwin_conv_path(CCP_WIN_A_TO_POSIX, (const void *)s.c_str(), (void *)buf, (size_t)MAX_PATH);
和变化:
(void)cygwin_conv_to_win32_path(s.c_str(), buf);
到
(void)cygwin_conv_path(CCP_POSIX_TO_WIN_A, (const void *)s.c_str(), (void *)buf, (size_t)MAX_PATH);
我实际使用JesperE答案https://stackoverflow.com/a/374411/380247(它允许您VS版本之间切换),但发现了一种不创建临时bat文件。所以结果要简单得多。
function run_in_vs_env
{
eval vssetup="\$$1\\vsvars32.bat"
cmd /Q /C call "$vssetup" "&&" "${@:2}"
}
function run_vs11
{
run_in_vs_env VS110COMNTOOLS "[email protected]"
}
function run_vs10
{
run_in_vs_env VS100COMNTOOLS "[email protected]"
}
我建议将这些行添加到.bash_functions或类似的东西,并将这些函数导出到那里。这将允许您在bash脚本中使用函数。
export -f run_in_vs_env
export -f run_vs11
export -f run_vs10
这一问题与 http://stackoverflow.com/questions/62029/vs2008-command-prompt-cygwin/168447#168447 – Ted 2009-06-05 15:37:10
我wrapmsvc [http://code.google.com/p/ wrapmsvc]程序可能会有所帮助。它是调用cl的包装器。exe和其他通过Wine从Linux的MS工具;它将unix风格的路径转换为Wine的windows风格路径,并通过Wine启动真正的工具。这意味着你可以用unix路径调用编译器而不会混淆真实的编译器。当然,它在Cygwin中不起作用,因为那里没有Wine,但是你可以修改它来不使用Wine,而是用其他方式进行路径转换。 – 2012-04-23 11:41:50