LinuxでVisual Studio 2010 Shellを使用してgccでプロジェクトをコンパイルする

Microsoft Visual Studio 2010が強力なIDEであることは周知の事実です。これにより、特に.vcxprojファイルに変更を加えることで、プロジェクトチームの構築プロジェクトを置き換えることができます。 判明したように、この機能を使用して、Visual Studioで別のLinuxマシンで実行されているgccを使用してプロジェクトをビルドすることができます。 同時に、Linux上のgccへのアクセスは、sshなどを介してネットワーク経由で行われる必要があります。 この記事では、このような異常なVisual Studioのセットアップでの実験について説明します。



プログラムがあるとします:





#include <stdio.h> int main() { printf("Hello world!"); fflush(stdout); getchar(); return 0; }
      
      







このプログラムはLinux上で構築され、gccを使用する必要があります。 もちろん、これは単なる例であり、実際には、数十万のファイルと、提案されたソリューションの本質を変えない、makefile上の確立されたビルドシステムを持つLinuxの大規模プロジェクトについて話すことができます。 私たちのタスクは、Visual Studioでプログラムコードを編集し、その構成に含まれるコード分析ツールやその他のツールを使用する機能を提供することです。

まず、このプログラムの簡単なメイクファイルを作成しましょう。



NAME =テスト

OBJS = main.o



.SUFFIXES:.cpp

.SUFFIXES:.o



すべて:$(NAME)



きれいな:

rm -rf * .o



cleanall:クリーン

rm -rf * .d map dep *〜$(NAME)



再構築:すべてをきれいにする

@ esho再構築が完了しました。



$(名前):$(OBJS)

echo $(NAME)をコンパイルしています。

g ++ -o $(NAME)$(OBJS)



.cpp.o:

gcc -c $ *。cpp



次の問題を解決する必要があります。コードは、Windowsプラットフォーム(Visual Studio)で編集し、Linuxでコンパイルする必要があります。 これには、仮想マシンと共有フォルダーを使用できます。 たとえば、Windowsホストシステムでは、任意の仮想化ツール(Oracle VirtualBoxまたはVMware Workstation)をインストールし、仮想マシンを作成してLinuxをインストールできます。 その結果、WindowsとLinuxの両方で同時に作業することが可能になります。 共有フォルダー機能を使用すると、Linux仮想マシンからホストWindows OSファイルにアクセスできます。

VMware Workstationの場合、たとえばLinuxのD:\ proj \をprojフォルダーとして転送することにより、共有フォルダーを構成できます。 次に、WindowsからWindows D:\ proj \ main.cドライブにあるmain.cプログラムファイルを編集し、同時に/ mnt / hgfs / proj /フォルダーでLinux上のgccを使用してコンパイルします。



Visual Studioでは、プロジェクトビルドコマンドを置き換えることができます。

•ビルド-アセンブリ。

•再構築-プロジェクトのクリーニングと再組み立て。

•クリーン-プロジェクトファイルをクリーンアップします(すべてのバイナリファイルを削除します)。

さらにプロジェクトを開始するチーム。

Linux環境の場合、以下に対応します。

•ビルド:すべて作成

•再構築:再構築する

•クリーン:クリーンにする

•起動:./test



私たちのタスクは、通常のcmdで起動されたかのようにWindows上で実行することです。一方、Visual Studioから環境でコンパイルエラーを直接表示する場合は、コマンドの入力/出力をWindowsにリダイレクトします。 この問題を解決するには、Puttyパッケージからplink.exeユーティリティ(公式ウェブサイトwww.chiark.greenend.org.uk/~sgtatham/putty/download.htmlからダウンロード)を使用できます。 このユーティリティは、入力/出力を現在のcmd端末に正しくリダイレ​​クトしながら、sshを介して1つのコマンドを実行できます。

Linuxが仮想マシンで構成され、WindowsからIPアドレス192.168.1.8、ユーザー名、パスワードを使用してssh経由でアクセスできるように構成されているとします。次に、cmdを実行すると、Windowsでコマンドを正常に実行できます。

D:\ proj \ tools> plink -batch -pw 123456 user@192.168.1.8 pwd

/ホーム/ユーザー

プログラムの結果は、「pwd」がユーザーのホームディレクトリで実行されたことを示しています。 これは、cmdで直接次のようにテストプログラムをコンパイルできることを意味します。



  D:\ proj \ tools> plink -batch -pw 123456 user@192.168.1.8 cd / mnt / hgfs / proj /; 再構築する
 rm -rf * .o
 rm -rf * .d map dep *〜テスト
 gcc -c main.cpp
テストのコンパイル。
 g ++ -o test main.o
再構築が完了しました。 




次に、指定されたメソッドをVisual Studioに統合する必要があります。 これを行うには、projディレクトリにvs_testという空のソリューションを作成します。 作成したソリューションにプロジェクト「vs_test」を追加します。 プロジェクトはMakefileタイプである必要があります(他のすべてのデフォルト設定)。















結果は、次のファイルツリーです。



D:\ proj \ main.c

D:\ proj \ makefile

D:\ proj \ tools \ plink.exe

D:\ proj \ vs_test \ vs_test.sln

D:\ proj \ vs_test \ vs_test.suo

D:\ proj \ vs_test \ vs_test.sdf

D:\ proj \ vs_test \ vs_test \ vs_test.vcxproj

D:\ proj \ vs_test \ vs_test \ vs_test.vcxproj.filters

D:\ proj \ vs_test \ vs_test \ vs_test.vcxproj.user



次に、メイクファイルとmain.cを「vs_test」プロジェクトに追加する必要があります これを行うには、プロジェクトオプション 'Add-> Existing Item ...'を使用します。 したがって、ソリューションエクスプローラーで次の図を取得します。







次に、「プロジェクトのアンロード」オプションを使用して、ソリューションからプロジェクトをアンロードします。







オプション 'Edit vs_test.vcxproj'を使用して、プロジェクトファイルを編集用に開きます。







「ファイル->新規->ファイル...」を使用して、テキストファイルを作成し、make_vs.propsと呼び、D:\ proj \ make_vs.propsに配置します。

次に、タグ 'Import'を使用して、ファイルmake_vs.propsのテキストをvs_test.vcxprojに含めます。 これを行うには、vs_test.vcxprojファイルで、make_vs.propsから追加のプロジェクト設定をインポートする行を追加します。



 <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(SolutionDir)..\make_vs.props" /> <ImportGroup Label="ExtensionSettings"> </ImportGroup>
      
      







make_vs.propsファイルでは、プロジェクト設定をオーバーライドするか、独自の設定を追加できます。 次のmake_vs.propsファイルを取得しました。



 <?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup Label="RemoteBuildLocals"> <RblFolder>proj</RblFolder> <RblIncludePath>$(SolutionDir)\..\inc\</RblIncludePath> <RblExecute>./test</RblExecute> </PropertyGroup> <PropertyGroup Label="RemoteBuildSettings"> <RbHost>192.168.1.8</RbHost> <RbUser>user</RbUser> <RbPassword>123456</RbPassword> <RbRoot>test_src</RbRoot> </PropertyGroup> <PropertyGroup Label="RemoteBuild"> <RbToolArgs> -pw $(RbPassword) $(RbUser)%40$(RbHost) cd $(RbRoot); cd $(RblFolder);</RbToolArgs> <RbToolExe>$(SolutionDir)..\tools\plink -batch $(RbToolArgs)</RbToolExe> <RbBuildCmd>$(RbToolExe) make all</RbBuildCmd> <RbRebuildAllCmd>$(RbToolExe) make rebuild</RbRebuildAllCmd> <RbCleanCmd>$(RbToolExe) make cleanall</RbCleanCmd> <RbExecuteCmd>$(RbToolArgs) $(RblExecute)</RbExecuteCmd> <RbIncludePath>$(RblIncludePath)</RbIncludePath> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <NMakeBuildCommandLine>$(RbBuildCmd)</NMakeBuildCommandLine> <NMakeReBuildCommandLine>$(RbRebuildAllCmd)</NMakeReBuildCommandLine> <NMakeCleanCommandLine>$(RbCleanCmd)</NMakeCleanCommandLine> <IncludePath>$(RbIncludePath)</IncludePath> <LocalDebuggerCommand>$(SolutionDir)..\tools\plink</LocalDebuggerCommand> <LocalDebuggerCommandArguments>$(RbExecuteCmd)</LocalDebuggerCommandArguments> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <NMakeBuildCommandLine>$(RbBuildCmd)</NMakeBuildCommandLine> <NMakeReBuildCommandLine>$(RbRebuildAllCmd)</NMakeReBuildCommandLine> <NMakeCleanCommandLine>$(RbCleanCmd)</NMakeCleanCommandLine> <IncludePath>$(RbIncludePath)</IncludePath> <LocalDebuggerCommand>$(SolutionDir)..\tools\plink</LocalDebuggerCommand> <LocalDebuggerCommandArguments>$(RbExecuteCmd)</LocalDebuggerCommandArguments> </PropertyGroup> </Project>
      
      







「プロジェクトの再読み込み」を使用してプロジェクトを再読み込みします。 F5を押すだけです。 この後、すべてが次のようになります。









やった! コンパイルのために、Visual Studio自体がLinuxのmakeおよびgccに変わり、IDEウィンドウでgccから出力を受け取り、Windowsからも使用できるテストプログラムを起動しました。

ここで、メインファイルmake_vs.propsを簡単に調べます(最後から始めましょう..)。 1つのプロジェクトから別のプロジェクトへのテキストの不必要なコピーを回避するために、ファイルは設定のグループに分割されます(この種の100以上のプロジェクトからのソリューションのテクニックが実際にテストされています)。

最初の(実際には最後の)ブロックは、Visual Studioがプロジェクトのビルドに使用する設定ブロックであり、デバッグ構成とリリース構成の2つの重複したグループで構成されます。



 <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <NMakeBuildCommandLine>$(RbBuildCmd)</NMakeBuildCommandLine> <NMakeReBuildCommandLine>$(RbRebuildAllCmd)</NMakeReBuildCommandLine> <NMakeCleanCommandLine>$(RbCleanCmd)</NMakeCleanCommandLine> <IncludePath>$(RbIncludePath)</IncludePath> <LocalDebuggerCommand>$(SolutionDir)..\tools\plink</LocalDebuggerCommand> <LocalDebuggerCommandArguments>$(RbExecuteCmd)</LocalDebuggerCommandArguments> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <NMakeBuildCommandLine>$(RbBuildCmd)</NMakeBuildCommandLine> <NMakeReBuildCommandLine>$(RbRebuildAllCmd)</NMakeReBuildCommandLine> <NMakeCleanCommandLine>$(RbCleanCmd)</NMakeCleanCommandLine> <IncludePath>$(RbIncludePath)</IncludePath> <LocalDebuggerCommand>$(SolutionDir)..\tools\plink</LocalDebuggerCommand> <LocalDebuggerCommandArguments>$(RbExecuteCmd)</LocalDebuggerCommandArguments> </PropertyGroup>
      
      







ご想像のとおり、タグの値は次のとおりです。

•NMakeBuildCommandLine-ビルドコマンド(すべて作成)。

•NMakeReBuildCommandLine-再構築(再構築の作成)コマンド。

•NMakeCleanCommandLine-クリーン(メイククリーン)コマンド。

•IncludePath-ディレクトリのリストを含めます。 有効なリストがないと、VSはコードを適切に処理および解析できません。

•LocalDebuggerCommand-コンパイル後にプログラムを開始するコマンド。

•LocalDebuggerCommandArguments-コンパイル後にプログラムが起動するときのコマンドへの引数。



この時点で、他の設定ではすべての値が参照されます。 Common.propsでこの設定グループを強調表示し、この種類のすべてのプロジェクトに常に含めると便利です。



次の設定グループは、アセンブリ中に実行する必要があるコマンドのタスクに対応しています。



  <PropertyGroup Label="RemoteBuild"> <RbToolArgs> -pw $(RbPassword) $(RbUser)%40$(RbHost) cd $(RbRoot); cd $(RblFolder);</RbToolArgs> <RbToolExe>$(SolutionDir)..\tools\plink -batch $(RbToolArgs)</RbToolExe> <RbBuildCmd>$(RbToolExe) make all</RbBuildCmd> <RbRebuildAllCmd>$(RbToolExe) make rebuild</RbRebuildAllCmd> <RbCleanCmd>$(RbToolExe) make cleanall</RbCleanCmd> <RbExecuteCmd>$(RbToolArgs) $(RblExecute)</RbExecuteCmd> <RbIncludePath>$(RblIncludePath)</RbIncludePath> </PropertyGroup>
      
      





タグの値は次のとおりです。

•RbToolArgs-常に使用されるplinkユーティリティの標準引数。

•RbToolExe-後で使用されるすべてのコマンドの先頭の合計値。

•RbBuildCmdは、単純なビルドコマンドです。

•RbRebuildAllCmd-単純な再構築コマンド。

•RbCleanCmdは、単純なCleanコマンドです。

•RbExecuteCmd-アセンブリ後にテストプログラムを実行するために、すべてがコマンドと引数に分割されます-この部分は引数を担当します。

•RbIncludePath-インクルードディレクトリの再指定されたリスト。



同じCommon.propsで説明されている設定のグループを強調表示すると便利です。



次の設定グループはすべてのプロジェクトに共通ですが、一部のパラメーターはスタンドの設定によって異なります。



  <PropertyGroup Label="RemoteBuildSettings"> <RbHost>192.168.1.8</RbHost> <RbUser>user</RbUser> <RbPassword>123456</RbPassword> <RbRoot>test_src</RbRoot> </PropertyGroup>
      
      







ご覧のとおり、ホスト名、ユーザーID、パスワード、およびLinuxプロジェクトファイルがあるディレクトリへのパスが示されています。 これらの設定を特別なuser.propsで選択し、Importタグを使用してCommon.propsに含めると便利です。

設定の最後のグループは、特定のプロジェクトにのみ適用されます。



  <PropertyGroup Label="RemoteBuildLocals"> <RblFolder>proj</RblFolder> <RblIncludePath>$(SolutionDir)\..\inc\</RblIncludePath> <RblExecute>./test</RblExecute> </PropertyGroup>
      
      







タグの値は次のとおりです。

•RblFolder-プロジェクトファイルがあるフォルダー(Linuxの場合)。

•RblIncludePath-ディレクトリのリストを含めます(Windowsの場合)。

•RblExecute-開始するコマンド。







各Buildコマンドでssh接続が確立されることに注意してください。これには時間がかかります(たとえば、約2〜5秒かかりました)。

その結果、Visual StudioでLinuxのmakefileとgccを使用してプロジェクトをビルドすることができました。



All Articles