我大量使用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