私は Cygwin を多用しています ( PuTTYシェルを使用)。cl.exe
ただし、 Cygwin Bash シェルで (つまり、Visual C++ コンパイラ ツールチェーンを) 呼び出すのは非常に困難です。Bash シェルでの実行vcvars*.bat
は明らかに機能しません。VC++ の環境変数を Cygwin に移行しようとしましたが、それほど簡単ではありません。
Cygwin の Bash シェルで VC++ コンパイラを実行するにはどうすればよいですか?
私は Cygwin を多用しています ( PuTTYシェルを使用)。cl.exe
ただし、 Cygwin Bash シェルで (つまり、Visual C++ コンパイラ ツールチェーンを) 呼び出すのは非常に困難です。Bash シェルでの実行vcvars*.bat
は明らかに機能しません。VC++ の環境変数を Cygwin に移行しようとしましたが、それほど簡単ではありません。
Cygwin の Bash シェルで VC++ コンパイラを実行するにはどうすればよいですか?
私は通常これを追加することで解決します
call "%VS80COMNTOOLS%vsvars32.bat" >NUL:
c:/cygwin/cygwin.batへ。VS80COMNTOOLS変数は、vsvars32.batを見つけるための絶対確実な(hm)方法を提供するため、非常に便利であることに注意してください。
もう1つのアプローチはこれです。これにより、異なるStudioバージョンを簡単に切り替えることができます。
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"` "$@"
status=$?
rm -f $tmpfile
return $status
}
function run_vs9()
{
run_with_bat VS90COMNTOOLS "$@"
}
function run_vs8()
{
run_with_bat VS80COMNTOOLS "$@"
}
これで、次のことができます。
$ 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... ]
コンパイラのバージョンに注意してください。
問題が vcvars32.bat をシェル スクリプトに変換していることを理解しています。
この問題を回避する 1 つの方法は、あるプロセスが別のプロセスを起動するときに環境変数が継承されるという考えに基づいています。そのため、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 を呼び出す前後に set を実行し、シェル スクリプトを作成して環境変数を設定します。
他の回答の提案に従って、MSVC 変数を使用した場合と使用しない場合の bash "set" の結果の差分を作成し、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"
私は実際に JesperE の回答https://stackoverflow.com/a/374411/380247 (VS バージョンを切り替えることができます) を使用しましたが、一時的なバット ファイルを作成しない方法を見つけました。したがって、結果ははるかに簡単です。
function run_in_vs_env
{
eval vssetup="\$$1\\vsvars32.bat"
cmd /Q /C call "$vssetup" "&&" "${@:2}"
}
function run_vs11
{
run_in_vs_env VS110COMNTOOLS "$@"
}
function run_vs10
{
run_in_vs_env VS100COMNTOOLS "$@"
}
これらの行を .bash_functions などに追加して、これらの関数をそこにエクスポートすることをお勧めします。これにより、bash スクリプトで関数を使用できるようになります。
export -f run_in_vs_env
export -f run_vs11
export -f run_vs10
次に、次のことができるはずです。
run_vs11 cl
もう 1 つの方法は、vcvars32.bat (または Visual Studio の最近のバージョンで実際に機能する vsvars32.bat) を開いて、その動作を確認し、適切なシェル スクリプトでそれを複製することです。
特に複雑ではありません。一連の環境変数を設定するだけです。
vsvars32.bat
私は自分のファイルで自分のファイルを変換しましたvisual_studio.env
。コマンド ラインの Visual Studio 環境を使用する必要がある場合は、このファイルのソースを作成するだけです。
sh
シェル環境では、Windows パスを登録できない (そして\
と;
衝突するsh
) ため、 または で翻訳する前に、cygpath -au
またはでそれらをファイルcygpath -aup commands
に書き留めて、またはで翻訳し直します。.env
cygpath -aw
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
これがお役に立てば幸いです。
使用する方が良い戦略msbuild
であると同時にg++
、cygwin 環境を使用することもできます。visual studio
これは、より統合されたアプローチであり、既存の開発と調和してブレンドされます。最低レベルを使用しcl
て環境変数を設定すると、トラブルが発生し、逆風になります。私たちのmsbuild
ために物事をより良く設定することができます。また、完全な誓約*.vcxproj
プロジェクトを持つ IDE にステップ デバッグすることもできます。
ls -l ~/bin/msbuild
lrwxrwxrwx 1 johnny Domain Users 102 Sep 4 04:25 /home/johnny/bin/msbuild -> /cygdrive/c/Program Files (x86)/Microsoft Visual Studio/2017/Professional/MSBuild/15.0/Bin/MSBuild.exe
次に、~/.bashrc に次の関数を含めます。
builddebug (){
[ $# -eq 0 ] && return 1;
msbuild /m /p:Configuration=Debug /p:Platform=Win32 "$1"
}
開発体験の感触はこんな感じ。少なくとも、g++
コンパイラとVisual Studio 2017
コンパイラをより統合された方法で使用できます。そのことをしましょうmsbuild
。違いcl
ます。
私の場合、.bash_profileの次の機能が機能しました。
"`cygpath -ua "$VS80COMNTOOLS/vsvars32.bat"`" > NUL
cygwin 環境から msvc を使用してコンパイルするのに非常に役立つユーティリティの 1 つは、 「wrapmsvc」と呼ばれるCoin 3Dライブラリのソース リポジトリで見つけたラッパーです。バイナリはここにあります。
プログラムは cl.exe をラップし、指定された GCC 引数を適切な cl.exe 引数に変換します。また、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);
他の答えはどれもうまくいきませんでしたが、これはうまくいきました:
環境変数をダンプします。set > c:\temp\cl.env
cygwin コマンド プロンプトを開き、source
スクリプトを作成します。
awk < /cygdrive/c/temp/cl.env -F= '{ if($1 !~ ")") print "export " $1 "=\x27" $2 "\x27" }' > cl.source
cl.source を変更して、TEMP と TMP を C:\Temp に変更します。TEMP='C:\Temp'
これで、cl 環境が必要なときはいつでも、cygwin プロンプトから次を実行します。
source cl.source
必要に応じて、ログイン時に自動的に実行されるように、 .bashrcファイルにcl.source をソースとして追加します。
Diomidis の返信にコメントを追加できなかったので、代わりに回答を投稿する必要がありました。彼の回答には同意しますが、「コマンド プロンプトを開き」、Visual Studio/vcvars32.bat
を実行してから Bash を実行するのは面倒です。環境を乱雑にすることを気にしないでください。最良の代替手段は、次のように変更Cygwin.bat
して変更することです。
@echo off
D:
chdir D:\cygwin\bin
"%VS71COMNTOOLS%\vsvars32.bat" && bash --login -i
環境変数 VS71COMNTOOLS を、マシンに適したものに置き換えます。
コマンド プロンプトを開いて Bash を手動で実行する必要はありません。私はこのソリューションがとても好きです:)。彼の記事へのリンクが見つからなかったので、このハックの本当の作者にクレジットを与えることができませんでした。申し訳ありません!