Windowsでの同時Qtコンパイル

QtCreatorを使用したWindowsでのQtプロジェクトの並列コンパイルは、神秘的で非常にうるさい野獣です。 この短い記事では、すべて同じように飼いならす方法を説明します。 並列コンパイルは、理論的には非常に簡単に実行できますが、実際には非常にスムーズではありません。これは、あらゆる種類のソリューションが提供されるフォーラムの無限の数のトピックによって確認されます。 残念ながら、それらのどれも私たちを助けませんでした。





理論的には、MinGWの場合、make buildコマンドの–jパラメーター[コンパイルプロセスの数]を指定するだけで十分です。これは、QtSDK MinGWのmingw32-makeで表されます。 たとえば、コマンドmingw32-make.exe –j10が取得されます。



推奨されるコンパイルプロセスの数は、プロセッサの数+ 1です。 パラメータが設定されていない場合、j = 1と見なされます。 指定しすぎると、何も悪いことは起こりません。 makeはパフォーマンスの向上と同じくらい実行されます。



便宜上、システム内のプロセッサの数を示す環境変数%NUMBER_OF_PROCESSORS%を使用できます。 次の形式のコマンドが判明します



mingw32-make.exe –j%NUMBER_OF_PROCESSORS%







ただし、すべてがそれほど単純ではありません。 Qmakeは3つのメイクファイルを作成します。 一般的なMakefile。特定の定義に従って、リリースビルドまたはデバッグに応じてMakefile.DebugおよびMakefile.Releaseから選択します。 実際には、–jパラメーターは継承されません 。 そして、QtCreatorでmakeが呼び出されると、Makefileに対して呼び出されます。 しかし、Makefile.DebugまたはMakefile.Releaseには取得できません。



これを修正するには、コマンドを明示的記述する必要があります。 例えば



mingw32-make.exe –j9 –f Makefile.Debug.







あまり便利ではありませんが、アセンブリ速度の向上により大幅に補償されます。 たとえば、core-i7-2630で並列化せずにプロジェクトを再構築するには12分かかります。–j9フラグを使用すると、ビルドに2分もかかりません。 生産性の6倍の増加があなたを考えさせます。



しかし、そのようなアセンブリフラグを示した後でも、2台のマシンでは動作し始めましたが、2台のマシンでは動作しませんでした。 フォーラムは、OSバージョンであるqmakeの機能で、Qtバージョン、mingw曲率にある可能性があると書いています。 ただし、マシンの構成は除外されているため、QtSDK、QtCreator、Windowsのバージョンまたはシステムの容量はこれらすべてに関係していないと結論付けることができます。



解決策は非常に簡単ですが、同時にそれほど明白ではありません。 PATH環境変数にmingw32-makeへの絶対パスを追加する必要があります。 念のため、パスの後にセミコロンを配置することをお勧めします。 その後、奇跡的に並列コンパイルが機能し始め、プログラマはプロジェクトにQ_OBJECTを追加して再構築するたびに10分間気を散らす必要がなくなります。



これらすべてのコンパイルフラグは、makeオプションの[Projects]タブのQtCreatorで設定できます。



画像



この記事が有用であり、QtCreatorで並列アセンブリを行ったことのない多くの人々の問題を解決することを願っています。



UPD(コメントより) :Linux / MacOSユーザーに関しては、彼らはもっと幸運でした--jXスイッチだけで十分です。



また、MSVCコンパイラーを使用する場合、問題はありません。



QtCreatorの場合、エントリを追加する必要があります

QMAKE_CXXFLAGS_RELEASE += -MP[ ]





.proプロジェクトファイルで、説明したように環境変数を設定します。



Visual Studioの場合、VSプロジェクトのプロパティ:「プロパティ」=>「構成プロパティ」=>「C / C ++」=>「コマンドライン」。 「追加オプション」フィールドに-MP [プロセス数]を追加します。 おかげでIGHOR



また、MSVCコンパイラを使用する場合、jomが役立ちます。



フラグの定数部分は、別の環境変数MAKEFLAGSに移動できます。 Makeはそこから設定されたフラグを取得します。 たとえば、MAKEFLAGS = -j10。 また、makeパラメーターでは、アセンブリのファイルを指定することを忘れないでください。 たとえば、-f Makefile.Debug。 常に1つのバージョンを収集する場合、柱のすべてのフラグをMAKEFLAGSに入れて、将来のプロジェクトのセットアップを忘れることができます。



追加してくれたみんなに感謝します。



All Articles