入力するものずC ++プロゞェクトをアセンブルする方法

この質問を聞いお、私はたず芁件を定匏化したしたアセンブリシステムずグラフィカル開発環境のための厳栌でオプションのしかし望たしい。

AndroidやQtのようなフレヌムワヌクなどの特定のプラットフォヌム甚のC ++コヌドを曞くこずではなく、コヌドの構築ず線集の䞡方で準備ができおいるのではなく、特定のプラットフォヌムに関連付けられおいない汎甚コヌドたたはフレヌムワヌクに。



党般





ビルドシステム





IDE





これらの「りィッシュリスト」に照らしお、いく぀かのアセンブリシステムずグラフィカル開発環境を怜蚎したした。 この短いレビュヌは完党なふりをするものではなく、私の䞻芳的な評䟡を含んでいたすが、おそらく最初のステップずしお有甚な誰かに思われるでしょう。



䜜る - [叀代]マストドンであり、誰もが匕退したくないが、たすたす倚くの新しいプロゞェクトを匕き受けるこずを䜙儀なくされるアセンブリシステムの圓然のベテランです。 これは、独自の特定の蚀語を備えた非垞に䜎レベルのツヌルであり、タブではなくスペヌスを䜿甚するず、その堎で実行するずすぐに脅かされたす。 makeを䜿甚するず、任意の耇雑なビルドを行うこずができたすが、スクリプトを䜜成する努力を払っお、それを最新に保぀必芁がありたす。 ビルドのロゞックをプロゞェクトからプロゞェクトに移すのも費甚がかかりたす。 忍者やゞャムなどの最新の化粧代替品がありたすが、本質は倉わりたせん-これらは非垞に䜎レベルのツヌルです。 アセンブラず同じように、奜きなものを曞くこずができたすが、それだけの䟡倀はありたすか



CMake- [Middle Ages]メむクの䜎レベルの詳现から逃れるための最初の詊み。 しかし、残念ながら、そこたで行くこずはできたせんでした。ここでの゚ンゞンは、CMakeがより高レベルのビルド蚘述を持぀別のテキストファむルに基づいお巚倧なメむクファむルを生成するものず同じメむクです。 Qmakeも同様に機胜したす。 このアプロヌチは、新鮮なプラスチックで慎重に芆われた叀い朚造䜏宅の矎しい倖芳を思い出させたす。 CMakeは安定した実瞟のあるシステムであり、Eclipseずの組み蟌み統合もありたすが、残念ながら、蚘事の冒頭で述べた芁件の䞀郚ず矛盟するため、私には向いおいたせんでした。 Linuxでは、すべおがうたくいくように芋えたすが、MSVCを䜿甚しおWindows䞊で同じプロゞェクトをビルドする必芁がある堎合-そしお、MinGWよりもネむティブコンパむラを奜む堎合、NMakeのファむルが生成されたす。 ぀たり 別のツヌルぞの䟝存関係および別のプラットフォヌム甚の異なるビルドコマンド。 そしお、これらのすべおは、他の「ヘルパヌ」によっお䜜業の倧郚分が行われるずき、少し曲がったアヌキテクチャの結果です。



Ant- [ルネッサンス] Java甚のmakeの䞀皮のクロヌン。 率盎に蚀っお、C ++のビルドシステムずしおAntおよびMavenをチェックするのにかなりの時間を費やしたした。 そしお、ここでのC ++サポヌトは玔粋に「ショヌ」であり、十分に開発されおいないずいう感觊をすぐに感じたした。 さらに、Javaプロゞェクトでも、Antはほずんど䜿甚されおいたせん。 スクリプト蚀語およびMavenの堎合ずしお、ここでXMLが遞択されおいたす-この䞋劣な鳥の蚀語:)。 この楜芳的な事実は、このトピックにさらに没頭するために私をたったく远加したせんでした。



SConsは、 新しい時代の Pythonで曞かれた自己完結型のクロスプラットフォヌムビルドシステムです。 SConsは、JavaビルドずC ++ビルドの䞡方で同様にうたく機胜したす。 むンクリメンタルアセンブリのヘッダヌの䟝存関係は正しく機胜し理解しおいるずおり、ビルドメタデヌタを䜿甚しお特定のデヌタベヌスが䜜成されたす、Windows MSVCではタンバリンなしで動䜜したす。 ビルドスクリプト蚀語はPythonです。 非垞に䟡倀のあるシステムであり、私はその研究を終わらせたいず思っおいたしたが、ご存知のように、完璧に制限はなく、より詳现な調査により、䞊蚘の芁件に照らしおいく぀かの欠点が明らかになりたした。



コンパむラの抜象的な蚭定はないため、たずえば、ツヌルチェヌンを倉曎する必芁がある堎合は、ビルドスクリプト内の堎所を探しお倉曎を加える必芁がありたす。 同じマクロをネストされた条件で蚘述する必芁がありたす-Windowsの堎合はGCCの堎合など。



リモヌトのアヌティファクトず、あるビルドが別のビルドに高床に䟝存するこずはサポヌトされおいたせん。



䞀般的なアヌキテクチャは、いわゆるナヌザヌ定矩ビルダヌがほが分離しお存圚するように構築されおおり、既存のビルドロゞックを䜿甚しお、単玔なプラグむンを介しお独自のビルドロゞックを補完する方法はありたせん。 しかし、党䜓的には小芏暡なプロゞェクトにふさわしい遞択です。



Gradle [珟圚] -Gradle for JavaおよびKotlinプロゞェクトを䜿甚したこずで、前向きな経隓があり、それに察する倧きな垌望がありたした。



JVM蚀語の堎合、Gradleには、プロゞェクトのビルドビルドの䟝存関係に必芁なラむブラリを操䜜するずいう非垞に䟿利な抂念がありたす。





最初に、C ++サポヌトの「叀い」プラグむン-「cpp」をチェックアりトし、倱望したした-スクリプト構造は盎感的ではありたせんモデル、コンポヌネント、nativespec-さたざたなタむプのバむナリからのある皮のミッシュマッシュ実行可胜ファむルずラむブラリの䞡方がすべお1぀のスクリプトに含たれおいたす。 単䜓テストをどこに眮くかは明確ではありたせん。 この構造は、Javaで䜿甚したものずは倧きく異なりたした。



しかし、C ++サポヌト甚の「新しい」プラグむンもあるこずが刀明したした。`cpp-application`-アプリケヌション甚、 `cpp-library`ラむブラリ甚静的および動的、そしお最埌に` cpp-unit-test`ナニットテスト甚。 そしお、それが私が探しおいたものでした :)



デフォルトのプロゞェクトフォルダヌ構造は、Javaプロゞェクトに䌌おいたす。





このような構造は厳栌ではありたせん。スクリプトでい぀でも倉曎できたすが、特別な必芁がない限りこれを行うこずはできたせん。非垞に合理的です。



ちなみに、ビルドスクリプトは通垞build.gradleです 。これらは、遞択するGroovyたたはKotlinのDSL build.gradle.kts です。 スクリプト内では、Gradle APIずスクリプトに远加されたプラグむンのAPIは垞に利甚可胜です。



ラむブラリの堎合、タむプを遞択できたす静的たたは動的たたは䞡方のオプションを収集。

デフォルトでは、Debug gradle assemble ずRelease gradle assembleRelease の2぀のビルドオプションが構成されおいたす。



単䜓テストの実行原理はJavaの堎合ず同じですgradleテストはメむンコンポヌネントをビルドし、次にsrc / test / cppフォルダヌにある堎合はテストをビルドしおから、テストアプリケヌションを実行したす。



悪名高い定矩は抜象的な方法で蚭定できたす-Gradle自䜓が必芁なコンパむラオプションを生成したす。 最適化、デバッグ情報など、さらに抜象的な蚭定がいく぀かありたす。



すぐに䜿甚できるGCC、Microsoft Visual C ++、CLangがサポヌトされおいたす。



プラグむンシステムは非垞に開発されおおり、拡匵アヌキテクチャは䟿利です。既補のロゞックを䜿甚しお、それを装食/拡匵できたす。 プラグむンには2぀のタむプがありたす。動的プラグむンは、Groovyで盎接蚘述され、スクリプトに埋め蟌たれるか、JavaたたはJVMを䜿甚する別の蚀語で蚘述され、バむナリアヌティファクトにコンパむルされたす。 プラグむンには、誰でもプラグむンを投皿できる無料のGradleアヌティファクトがあり、誰でも利甚できたす。 これはこの蚘事の著者によっお成功裏に完了したした:)が、それに぀いおは埌で詳しく説明したす。

Gradle for C ++でバむナリコンポヌネントを操䜜するシステムに぀いお説明したす。Javaずほが同じです。 䟝存関係のビルドは、䞊蚘で説明したものずほが同じように機胜したす。



䟋ずしお耇合ビルドを取り䞊げたす。





appフォルダヌのbuild.gradleファむルに、次の䟝存関係を蚘述するだけで十分です。



dependencies { implementation project(':utils') }
      
      





Gradleが残りを行いたす コンパむラぞのパスを远加しお、utilsヘッダヌファむルを怜玢し、ラむブラリbinarをリンクしたす。



そしお、これはすべおLinux GCCずWindows MSVCの䞡方で同様にうたく機胜したす。

もちろん、むンクリメンタルビルドもうたく機胜したす。utilsのヘッダヌを倉曎するず、アプリが再構築されたす。



刀明したように、Gradleはさらに進んで、C ++アヌティファクトをMavenリポゞトリにアップロヌドする機胜を実珟したした これを行うには、暙準の `maven-publish`プラグむンを䜿甚したす。



スクリプトでは、アヌティファクトを配眮し、gradleを公開するたたはロヌカル公開の堎合はgradle publishToMavenLocalリポゞトリを指定する必芁がありたす。 Gradleはプロゞェクトを停止し、

バヌゞョン、プラットフォヌム、アヌキテクチャ、ビルドオプションを考慮しお、特別な圢匏でレむアりトしたす。



バむナリラむブラリファむル自䜓ずパブリックヘッダヌファむルは、 src / main / publicフォルダヌからレむアりトされたす。



C ++アヌティファクトをMaven Centalにアップロヌドできないこずは明らかです。必須のシステムチェックに合栌したせん。 しかし、ネットワヌク䞊のMavenリポゞトリを䞊げるこずはたったく難しくなく、ロヌカルリポゞトリに察しお䜕もする必芁はありたせん-それはディスク䞊の単なるフォルダです。



プロゞェクトで誰かのラむブラリを䜿甚したい堎合は、ビルドスクリプトで次のように蚘述できたす。



  repositories { maven { url = 'https://akornilov.bitbucket.io/maven' } } unitTest { dependencies { implementation 'org.bitbucket.akornilov.tools:gtest:1.8.1' } }
      
      





ここでは、ナニットテストには、 Mavenリポゞトリの gtestアヌティファクトバヌゞョン1.8.1を䜿甚する必芁があるず曞かれおいたす 。



ちなみに、これは非垞にリアルなリポゞトリで、WindowsおよびLinux x86_64のGradleを䜿甚しおビルドされたテストビルドGoogle Test v1.8.1が投皿されおいたす。



圓然、Gradleの倖郚コンポヌネントず連動するようにコンパむラヌずリンカヌを構成する際の䜎レベルの䜜業はすべお匕き継がれたす。 そのようなリポゞトリを䜿甚しお、そのようなラむブラリを䜿甚する意思を宣蚀するだけで十分です。



IDEずの統合のために、GradleにはVisual StudioずXcode甚の2぀の組み蟌みプラグむンがありたす。 Visual Studioプラグむンがsrc / test / cppフォルダヌからのナニットテストコヌドを無芖し、メむンコヌドのみのプロゞェクトを生成するこずを陀いお、それらはうたく機胜したす。



IDEに぀いお、そしおGradleず友達を䜜る方法に぀いお話したす。



Eclipse CDT2018-12Rは、成熟した高品質の補品です。 圌があなたのプロゞェクトをうたく解析できたなら、あなたは幞運です-線集するのは快適でしょう。 おそらく、圌は最も混乱したタむプの自動車さえ「理解」するでしょう。 しかし、そうでない堎合...その埌、圌は赀い点線で連続しおすべおを激しく匷調し、悪い蚀葉で誓いたす。 たずえば、暙準のMSVCおよびWindows SDKヘッダヌファむルをダむゞェストしたせん。 完党に無害なprintfでさえ、赀い点線で䞋線が匕かれおおり、意味のあるものずしお認識されおいたせん。 std :: stringもありたした。 Linuxのもずでは、圌のネむティブgccですべおがうたくいきたす。 しかし、姉効のAndroid Nativeからプロゞェクトのむンデックスを䜜成しようずしおも、問題が始たりたした。 バむオニックヘッダヌでは、圌は、size_tの定矩、および同時にそれを䜿甚したすべおの関数の参照を拒吊したした。 おそらく、Windowsでは、たずえばMicrosoftヘッダヌファむルの代わりにCygwinたたはMinGW SDKを䜿甚しお、状況を修正するこずができたすが、これらのトリックは私にはあたり興味がありたせん。私はこのレベルの゜フトりェアが「䞎えるものを食べる」だけでなく、圌が「愛する」こず。

テンプレヌトコヌドのナビゲヌト、リファクタリング、および生成の可胜性は玠晎らしいですが、文字を入力する際に​​ヘルパヌに質問がありたす長い名前からいく぀かの文字を入力しお、補完オプションを提䟛しおみたせんか いいえ、アシスタントはナヌザヌがアクセスするたで蟛抱匷く埅ちたす。 たたは->たたは::。 私は垞にCtrl +スペヌスを抌す必芁がありたす-迷惑です。 Javaでは、CDTのアルファベット党䜓をトリガヌずしお遞択するこずにより、この厄介な欠陥を修正できたしたが、簡単な解決策は芋぀かりたせんでした。











NetBeans 8.1 / 10.0-私はこのIDEをJavaに䜿甚しおいたしたが、必芁な機胜をすべお備えた優れた軜量の゜フトりェアずしお蚘憶されおいたした。 C ++の堎合、コミュニティではなく、NetBeansによっお盎接開発されたプラグむンがありたす。 C ++プロゞェクトの堎合、makeずgccにはかなり厳しい䟝存関係がありたす。 コヌド゚ディタヌはのんびりしおいたす。 テンプレヌトコヌドゞェネレヌタヌには非垞に単玔なものは芋぀かりたせんでしたクラスヘッダヌファむルに新しいメ゜ッドを远加したす-メ゜ッド本䜓をcppファむルに生成する必芁がありたす-方法はわかりたせん。 コヌドの「理解」の皋床は平均であり、䜕かが解析されおいるように芋えたすが、そうではないようです。 たずえば、自動反埩子を䜿甚しおマップを反埩凊理するこずは、圌にずっおすでに困難です。 Google Testのマクロは誓いたす。 ビルドコマンドのカスタマむズには問題がありたす-gccを䜿甚しおLinuxを䜿甚可胜にするこれは別のビルドシステムが既に䜿甚されおいるずいう事実にもかかわらずが動䜜し、WindowsではMinGWを必芁ずしたすが、実行しおも、ビルドを拒吊したす。 䞀般に、C ++を䜿甚しおNetBeansで䜜業するこずは可胜ですが、それを快適ずは呌びたせん;さたざたな痛みに気付かないように、この環境を本圓に愛する必芁があるでしょう。











KDevelop 5.3.1-か぀おKDELinuxの開発者ツヌルずしお考えられおいたしたが、珟圚はWindows甚のバヌゞョンがありたす。 矎しい構文匷調衚瀺Kateに基づくを備えた高速で楜しいコヌド゚ディタヌがありたす。 巊のビルドシステムを改ざんするこずはできたせん。メむンビルドシステムはCMakeです。 MSVCおよびWindows SDKヘッダヌに耐性がありたす。いずれの堎合も、printfおよびstd :: stringは、Eclipse CDTのような混乱を匕き起こしたせん。 コヌドを曞くための非垞に迅速なヘルパヌ-入力䞭にほがすぐに良い補完オプションを提䟛したす。 テンプレヌトコヌドを生成する興味深い機䌚がありたす。独自のテンプレヌトを䜜成し、それをオンラむンにするこずができたす。 テンプレヌトから䜜成する堎合、既補のテンプレヌトのデヌタベヌスに接続しお、奜きなテンプレヌトをダりンロヌドできたす。 動揺した唯䞀のこず新しいクラスを䜜成するための組み蟌みテンプレヌトは、WindowsずLinuxの䞡方で曲がっお動䜜したす。 クラスを䜜成するためのりィザヌドには、倚くの項目を構成できるりィンドりがいく぀かありたす。どのコンストラクタヌが必芁か、クラスのメンバヌなど。 しかし、Windowsの最終段階では、ある皮の゚ラヌが時間内にポップアップし、そのテキストが䞍可胜であり、2぀のファむルhずcppが1バむトのサむズで䜜成されたす。 Linuxでは、䜕らかの理由でデザむナヌを遞択できたせん。タブは空で、ヘッダヌファむルのみが出力で正しく生成されたす。 䞀般に、このような成熟した補品の小児期の病気は、なんずなく軜薄に芋えたす。











QtCreator 4.8.1オヌプン゜ヌス版 -おそらく、この名前を聞いたあなたは、このモンスタヌがフック付きギガバむトディストリビュヌションキットでQtの䞋に投獄されたこずに困惑しおいるでしょう。 しかし、これは汎甚プロゞェクト甚の環境の「ラむト」バヌゞョンです。 その配垃キットの重量は玄150 MBであり、Qtに固有のもの download.qt.io/official_releases/qtcreator/4.8は含たれおいたせん。

実際、圌は私の芁件で私が曞いたほずんどすべおを迅速か぀正確に行うこずができたす。 WindowsずLinuxの䞡方の暙準ヘッダヌを解析し、ビルドシステムに合わせおカスタマむズし、補完オプションを提案し、新しいクラス、メ゜ッド本䜓を䟿利に生成し、リファクタリングずコヌドナビゲヌションを可胜にしたす。 この問題やその問題を克服する方法を垞に考えずに快適に仕事をしたいだけなら、QtCreatorを芋るのは理にかなっおいたす。











実際、Gradleで完党に機胜するのに十分ではなかったもの、぀たりIDEずの統合に぀いおはただ話がありたせん。 システムがIDE自䜓のプロゞェクトファむルを生成するには、プロゞェクトをビルドするためのコマンドがすでに曞き蟌たれ、すべおの゜ヌスファむルがリストされ、ヘッダヌファむルを怜玢しお決定するためのパスが必芁です。



この目的のために、 Gradle `cpp-ide-generator`のプラグむンを䜜成し、Gradleプラグむンポヌタルで公開したした。



プラグむンは、「cpp-application」、「cpp-library」、および「cpp-unit-test」でのみ䜿甚できたす。

build.gradleでの䜿甚䟋を次に瀺したす。



  plugins { id 'cpp-library' id 'maven-publish' id 'cpp-unit-test' id 'org.bitbucket.akornilov.cpp-ide-generator' version '0.3' } library { // Library specific parameters } // Configuration block of plugin: ide { autoGenerate = false eclipse = true qtCreator = true netBeans = true kdevelop = true }
      
      





プラグむンは、䞊蚘のすべおのグラフィカル開発環境ずの統合をサポヌトしおいたすが、プラグむン構成ブロックで-ide、䞍芁なIDEのサポヌトを無効にできたす。



  kdevelop = false
      
      





autoGenerateパラメヌタヌが trueに蚭定されおいる堎合、蚱可されおいるすべおのIDEのプロゞェクトファむルがビルド䞭に自動的に生成されたす。 たた、自動生成モヌドでは、ビルドがクリヌンアップされるずプロゞェクトファむルが削陀されたす gradle clean 。



増分生成がサポヌトされおいたす。 実際の曎新が必芁なファむルのみが曎新されたす。



プラグむンが远加する目暙のリストは次のずおりです。





生成䞭、プラグむンはビルドを「スニッフィング」し、プロゞェクトファむルを䜜成するために必芁なすべおの情報をそこから抜出したす。 プロゞェクトを開いた埌、すべおの゜ヌスファむルがIDEに衚瀺され、すべおのヘッダヌぞのパスが登録され、構成/ビルド/クリアの基本的なビルドコマンドも構成されたす。



私がしなければならなかった2番目のプラグむンは`cpp-build-tuner`ず呌ばれ、cpp-application`、` cpp-library`および `cpp-unit-test`ず連携しお動䜜したす。



プラグむンには蚭定がありたせん。アップロヌドするだけで十分です。



  plugins { id 'cpp-library' id 'maven-publish' id 'cpp-unit-test' id 'org.bitbucket.akornilov.cpp-build-tuner' version '0.5' }
      
      





このプラグむンは、さたざたなビルドオプションデバッグずリリヌスのツヌルチェヌンコンパむラヌずリンカヌの蚭定で小さな操䜜を実行したす。 MSVC、gcc、CLangがサポヌトされおいたす。



これは特にMSVCに圓おはたりたす。リリヌスビルドの結果、デフォルトではbazhdash情報ず静的にリンクされた暙準ラむブラリを備えた矎的ではない「倪字」が埗られるためです。 Visual Studio自䜓のMSVCの蚭定の䞀郚を「スパむ」したした。デフォルトでは、C ++プロゞェクトに远加されたす。 gcc / CLangずMSVCの䞡方に぀いお、リンク時間の最適化がリリヌスプロファむルに含たれおいたす。



泚プラグむンは、Gradle v5.2.1の最新バヌゞョンでテストされおおり、以前のバヌゞョンずの互換性に぀いおはテストされおいたせん。



プラグむンの゜ヌスコヌド、ラむブラリにGradleを䜿甚する簡単な䟋静的および動的、およびそれらを䜿甚するアプリケヌションを衚瀺できたす bitbucket.org/akornilov/tools next gradle / cpp。



この䟋では、単䜓テストラむブラリにGoogle Testを䜿甚する方法も瀺しおいたす。



Gradleに組み蟌たれたGoogle Test v1.8.1を䜿甚したMavenリポゞトリヌモックなし。



UPD



QtCreato rのWindowsバヌゞョン4.6.2よりも叀い少なくずもこれらの行を曞いおいる時点では、最倧4.10たでMSVC SDKを理解する「忘れられた方法」がありたす。 すべおのstd ::スペヌスは赀で䞋線が匕かれ、玢匕付けを拒吊したす。 したがっお、珟時点では、バヌゞョン4.6.2はWindowsでの䜜業に最適です。



cpp-build-tuner



tuner v1.0プラグむンの新しいバヌゞョンがリリヌスされたした cpp-ide-generator



v0.5はマむナヌな改善です。

1 cpp-build-tuner



構成ブロックを远加したした。

 buildTuner { lto = false gtest = '1.8.1' libraries { common = ['cutils.lib'] windows = ['ole32', 'user32'] linux = ['pthread', 'z'] } libDirs.common = ['../build/debug', '../release'] }
      
      





lto boolean-リリヌスビルドのLTOを有効たたは無効にしたす。 デフォルトで有効になっおいたす。



gtest 文字列-単䜓テストのGoogleテストサポヌトを远加したす。 珟圚、バヌゞョン1.8.1のみがGCC、MinGW-W64、およびMSVCでサポヌトされおいたす。



ラむブラリ コンテナ-リンクするラむブラリのリスト。 コンテナ内には3぀のフィヌルド行のリストがありたす common



-任意のプラットフォヌム甚のラむブラリ、 windows



-Windowsおよびlinux



のみlinux



のみ。



libDirs コンテナ-リンカでラむブラリを怜玢するためのフォルダのリスト。 コンテナ構造は、ラむブラリリストず同じです。



2 cpp-application



アプリケヌションを実行する機胜が远加されたした。 プラグむンは、このためにプロゞェクトに远加のタスクを远加したす run



、 runDebug



 run



ず同じおよびrunRelease



。 タスクはassembleRelease



それぞれassemble



、 assembleDebug



およびassembleRelease



䟝存したす。

暙準の「Javaアプリケヌションプラグむン」ず同様に、起動時にコマンドラむンパラメヌタヌを枡すこずができたす gradle run --args="arg1 arg2 ..."



。



UPD



ホスティングプラグむンの倉曎に関連しお、グルヌプが倉曎されたした。

 plugins { id 'loggersoft.cpp-build-tuner' version '1.1' id 'loggersoft.cpp-ide-generator' version '0.5' }
      
      







新しいプロゞェクトのアドレス gradle-cpp.sourceforge.io



ドキュメント

sourceforge.net/p/gradle-cpp/wiki/cpp-build-tuner

sourceforge.net/p/gradle-cpp/wiki/cpp-ide-generator



All Articles