私はCygwinを多用しています( PuTTY Shellを使用)。ただし、Cygwin BashShellでcl.exe
(つまり、Visual C++コンパイラツールチェーン)を呼び出すのは非常に注意が必要です。 Bashシェルでvcvars*.bat
を実行しても明らかに機能しません。 VC++の環境変数をCygwinに移行しようとしましたが、それほど簡単ではありません。
CygwinのBashシェルでVC++コンパイラを実行するにはどうすればよいですか?
私は通常これを追加することで解決します
call "%VS80COMNTOOLS%vsvars32.bat" >NUL:
c:/cygwin/cygwin.batへ。 VS80COMNTOOLS変数は、vsvars32.batを見つけるための絶対確実な(hm)方法を提供するため、非常に便利であることに注意してください。
別のアプローチはこれです。これにより、異なる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の「設定」結果の差分を作成し、Microsoft Visual C++ 2010Expressのインストール用にそれらを再現する次のスクリプトを作成しました。インストールに依存するすべての部分を一番上に配置するように少しリファクタリングしたので、これが他の人にも役立つことを願っています。
# 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バージョンを切り替えることができます)が、一時的な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 "$@"
}
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
もう1つの方法は、vcvars32.bat(または、最近のバージョンのVisual Studioで実際の作業を行うvsvars32.bat)を開き、その機能を確認して、適切なシェルスクリプトで複製することです。
それは特に複雑ではありません-それがするのはたくさんの環境変数を設定することだけです。
msbuild
を使用する方が良い戦略だと思います。同時に、cygwin環境のg++
を使用することもできます。これはより統合されたアプローチであり、既存の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"
}
開発体験の感触は this のようになります。少なくとも、g++
コンパイラとVisual Studio 2017
コンパイラをより統合された方法で使用することができます。 msbuild
に任せましょう。 cl
ではありません。
コメントを追加できませんでした Diomidisの返信 :(なので、代わりに回答を投稿する必要がありました。彼の回答には同意しますが、「コマンドプロンプトを開く」を実行してVisualStudioを実行するのは面倒です。/vcvars32.bat
を実行してから、Bashを実行します。環境が乱雑になることを気にしない場合は、Cygwin.bat
を変更して、次のように変更するのが最善の方法です。
@echo off
D:
chdir D:\cygwin\bin
"%VS71COMNTOOLS%\vsvars32.bat" && bash --login -i
環境変数VS71COMNTOOLSを、マシンに適したものに置き換えてください。
コマンドプロンプトを開いてBashを手動で実行する必要はありません。私はこのソリューションがとても好きです:)。彼の記事へのリンクが見つからなかったため、このハッキングの本当の作者にクレジットを与えることができませんでした。申し訳ありません。
他の答えはどれも私にはうまくいきませんでしたが、これはうまくいきました:
環境変数をダンプします: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環境が必要なときはいつでも、cygwinプロンプトから次のコマンドを実行します。source cl.source
オプションで、。bashrcファイルのソースcl.sourceを使用して、ログイン時に自動的に実行します
私の場合、.bash_profileの次の機能が機能しました。
"`cygpath -ua "$VS80COMNTOOLS/vsvars32.bat"`" > NUL
Cygwin環境からmsvcを使用してコンパイルするのに非常に貴重だと思ったユーティリティの1つは、 Coin 3D ライブラリのソースリポジトリ「wrapmsvc」で見つけたラッパーです。誰のバイナリが見つかりますか ここ 。
プログラムは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);