CMake ず C++ は氞遠の兄匟です

CMake ず C++ は氞遠の兄匟です

開発䞭は、コンパむラ、ビルド モヌド、䟝存関係のバヌゞョンを倉曎し、静的解析を実行し、パフォヌマンスを枬定し、カバレッゞを収集し、ドキュメントを生成するこずが奜きです。 私は CMake が倧奜きです。やりたいこずはすべおできるからです。

CMake を批刀する人は倚く、圓然のこずも倚いですが、よく芋るず、すべおがそれほど悪いわけではありたせん。 悪くない、党く、開発の方向性は非垞に前向きです。

このノヌトでは、CMake システムの C++ でヘッダヌ ラむブラリを簡単に線成しお、次の機胜を取埗する方法を説明したいず思いたす。

  1. 組み立お;
  2. 自動実行テスト。
  3. コヌドカバレッゞの枬定。
  4. むンストヌル;
  5. 自動文曞化。
  6. オンラむンサンドボックス生成。
  7. 静的解析。

利点ず C-make をすでに理解しおいる人は、簡単に プロゞェクトテンプレヌトをダりンロヌドする そしお䜿い始めおください。


ペヌゞ内容

  1. 内偎からのプロゞェクト
    1. プロゞェクトの構造
    2. メむン CMake ファむル (./CMakeLists.txt)
      1. プロゞェクト情報
      2. プロゞェクトのオプション
      3. コンパむルオプション
      4. 䞻な目暙
      5. むンストヌル
      6. テスト
      7. ДПкуЌеМтацОя
      8. オンラむンサンドボックス
    3. テスト スクリプト (test/CMakeLists.txt)
      1. テスト
      2. ППкрытОе
    4. ドキュメント甚のスクリプト (doc/CMakeLists.txt)
    5. オンラむンサンドボックス甚のスクリプト (online/CMakeLists.txt)
  2. 屋倖でのプロゞェクト
    1. 組立
      1. 䞖代
      2. 組立
    2. オプション
      1. MYLIB_COVERAGE
      2. MYLIB_TESTING
      3. MYLIB_DOXYGEN_LANGUAGE
    3. 組み立お察象
      1. ППуЌПлчаМОю
      2. mylib-単䜓テスト
      3. チェック
      4. カバレッゞ
      5. DOC
      6. ワンドボックス
    4. 䟋
  3. ツヌル
  4. 静的解析
  5. 埌曞き

内偎からのプロゞェクト

プロゞェクトの構造

.
├── CMakeLists.txt
├── README.en.md
├── README.md
├── doc
│   ├── CMakeLists.txt
│   └── Doxyfile.in
├── include
│   └── mylib
│       └── myfeature.hpp
├── online
│   ├── CMakeLists.txt
│   ├── mylib-example.cpp
│   └── wandbox.py
└── test
    ├── CMakeLists.txt
    ├── mylib
    │   └── myfeature.cpp
    └── test_main.cpp

CMake スクリプトのたずめ方を䞭心に解説しおいきたすので、詳しく解説しおいきたす。 残りのファむルは誰でも盎接衚瀺できたす テンプレヌトプロゞェクトペヌゞで.

メむン CMake ファむル (./CMakeLists.txt)

プロゞェクト情報

たず、必芁なバヌゞョンの CMake システムをリク゚ストする必芁がありたす。 CMake は進化しおおり、コマンド シグネチャずさたざたな条件での動䜜が倉化しおいたす。 CMake が CMake に䜕を求めおいるかをすぐに理解するには、CMake に察する芁件をすぐに蚘録する必芁がありたす。

cmake_minimum_required(VERSION 3.13)

次に、プロゞェクト、その名前、バヌゞョン、䜿甚する蚀語などを指定したすを参照。 кПЌаМЎу project).

この堎合、蚀語を瀺したす CXX (これは C++ を意味したす) これにより、CMake は C 蚀語コンパむラヌを負担しお怜玢しなくなりたす (デフォルトでは、CMake には C ず C++ の XNUMX ぀の蚀語が含たれおいたす)。

project(Mylib VERSION 1.0 LANGUAGES CXX)

ここでは、自分のプロゞェクトが別のプロゞェクトにサブプロゞェクトずしお含たれおいるかどうかをすぐに確認できたす。 これは将来的に非垞に圹立ちたす。

get_directory_property(IS_SUBPROJECT PARENT_DIRECTORY)

プロゞェクトのオプション

XNUMX ぀のオプションを提䟛したす。

最初のオプションは MYLIB_TESTING — 単䜓テストを無効にしたす。 これは、テストですべおが順調であるこずを確認しおいるが、たずえば、プロゞェクトをむンストヌルたたはパッケヌゞ化したいだけである堎合に必芁になる可胜性がありたす。 たたは、プロゞェクトがサブプロゞェクトずしお含たれおいたす。この堎合、プロゞェクトのナヌザヌはテストの実行に興味がありたせん。 䜿甚する䟝存関係をテストしたせんよね?

option(MYLIB_TESTING "ВключОть ЌПЎульМПе тестОрПваМОе" ON)

たた、別途オプションにお察応させおいただきたす MYLIB_COVERAGE テストによるコヌド カバレッゞの枬定には远加のツヌルが必芁ずなるため、明瀺的に有効にする必芁がありたす。

option(MYLIB_COVERAGE "ВключОть ОзЌереМОе пПкрытОя кПЎа тестаЌО" OFF)

コンパむルオプション

もちろん、私たちは優秀なプログラマであるため、コンパむラからのコンパむル時蚺断の最倧レベルが必芁です。 ネズミ䞀匹もすり抜けたせん。

add_compile_options(
    -Werror

    -Wall
    -Wextra
    -Wpedantic

    -Wcast-align
    -Wcast-qual
    -Wconversion
    -Wctor-dtor-privacy
    -Wenum-compare
    -Wfloat-equal
    -Wnon-virtual-dtor
    -Wold-style-cast
    -Woverloaded-virtual
    -Wredundant-decls
    -Wsign-conversion
    -Wsign-promo
)

たた、C++ 蚀語暙準に完党に準拠するために、拡匵機胜も無効にしたす。 CMake ではデフォルトで有効になっおいたす。

if(NOT CMAKE_CXX_EXTENSIONS)
    set(CMAKE_CXX_EXTENSIONS OFF)
endif()

䞻な目暙

私たちのラむブラリはヘッダヌ ファむルのみで構成されおいたす。぀たり、静的ラむブラリたたは動的ラむブラリの圢匏での出力はありたせん。 䞀方、ラむブラリを倖郚で䜿甚するには、ラむブラリをむンストヌルし、システム内で怜出可胜にしおプロゞェクトに接続する必芁がありたす。同時に、これらの同じヘッダヌず、堎合によっおは远加のヘッダヌも必芁です。プロパティにアタッチされたす。

この目的のために、むンタヌフェむス ラむブラリを䜜成したす。

add_library(mylib INTERFACE)

ヘッダヌをむンタヌフェむス ラむブラリにバむンドしたす。

珟代的でファッショナブルな若者による CMake の䜿甚は、ヘッダヌやプロパティなどを意味したす。 単䞀のタヌゲットを介しお送信されたす。 これだけ蚀えば十分です target_link_libraries(target PRIVATE dependency)、およびタヌゲットに関連付けられおいるすべおのヘッダヌ dependency、タヌゲットに属する゜ヌスで利甚可胜になりたす target。 そしお䜕も必芁ありたせん [target_]include_directories。 これに぀いおは、以䞋の分析で説明したす。 単䜓テスト甚の CMake スクリプト.

いわゆるものにも泚意を払う䟡倀がありたす。 выражеМОя-геМератПры: $<...>.

このコマンドは、必芁なヘッダヌをむンタヌフェむス ラむブラリに関連付けたす。ラむブラリが同じ CMake 階局内のタヌゲットに接続されおいる堎合、ディレクトリのヘッダヌがそれに関連付けられたす。 ${CMAKE_CURRENT_SOURCE_DIR}/includeラむブラリがシステムにむンストヌルされおおり、コマンドを䜿甚しお別のプロゞェクトに接続されおいる堎合 find_package、その埌、ディレクトリのヘッダヌがそれに関連付けられたす include むンストヌルディレクトリからの盞察パス。

target_include_directories(mylib INTERFACE
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    $<INSTALL_INTERFACE:include>
)

蚀語の暙準を蚭定したしょう。 もちろん、䞀番最埌です。 同時に、暙準を含めるだけでなく、ラむブラリを䜿甚する人々にもそれを拡匵したす。 これは、蚭定されたプロパティにカテゎリがあるずいう事実によっお実珟されたす。 INTERFACE 参照しおください。 target_compile_features コマンド).

target_compile_features(mylib INTERFACE cxx_std_17)

ラむブラリの゚むリアスを䜜成したしょう。 さらに、矎しさのために、それは特別な「名前空間」にありたす。 これは、さたざたなモゞュヌルがラむブラリに衚瀺され、それらを互いに独立しお接続する堎合に圹立ちたす。 たずえばバスタのように.

add_library(Mylib::mylib ALIAS mylib)

むンストヌル

ヘッダヌをシステムにむンストヌルしたす。 ここではすべおがシンプルです。 すべおのヘッダヌを含むフォルダヌはディレクトリに配眮する必芁があるず蚀いたす。 include 蚭眮堎所を基準にしお。

install(DIRECTORY include/mylib DESTINATION include)

次に、サヌドパヌティ プロゞェクトでコマンドを呌び出せるようにするこずをビルド システムに通知したす。 find_package(Mylib) そしおゎヌルを埗る Mylib::mylib.

install(TARGETS mylib EXPORT MylibConfig)
install(EXPORT MylibConfig NAMESPACE Mylib:: DESTINATION share/Mylib/cmake)

次の呪文はこのように理解する必芁がありたす。 サヌドパヌティのプロゞェクトでコマンドを呌び出す堎合 find_package(Mylib 1.2.3 REQUIRED)、むンストヌルされおいるラむブラリの実際のバヌゞョンは、そのバヌゞョンず互換性がありたせん。 1.2.3CMake は自動的に゚ラヌを生成したす。 ぀たり、手動でバヌゞョンを远跡する必芁はありたせん。

include(CMakePackageConfigHelpers)
write_basic_package_version_file("${PROJECT_BINARY_DIR}/MylibConfigVersion.cmake"
    VERSION
        ${PROJECT_VERSION}
    COMPATIBILITY
        AnyNewerVersion
)
install(FILES "${PROJECT_BINARY_DIR}/MylibConfigVersion.cmake" DESTINATION share/Mylib/cmake)

テスト

テストが明瀺的に無効になっおいる堎合は、 察応するオプション たたは、プロゞェクトはサブプロゞェクトです。぀たり、次のコマンドを䜿甚しお別の CMake プロゞェクトに接続されおいたす。 add_subdirectory、階局に沿っおさらに進むこずはなく、テストを生成および実行するためのコマンドを蚘述したスクリプトは単に実行されたせん。

if(NOT MYLIB_TESTING)
    message(STATUS "ТестОрПваМОе прПекта Mylib выключеМП")
elseif(IS_SUBPROJECT)
    message(STATUS "Mylib Ме тестОруется в режОЌе пПЎЌПЎуля")
else()
    add_subdirectory(test)
endif()

ДПкуЌеМтацОя

サブプロゞェクトの堎合、ドキュメントも生成されたせん。

if(NOT IS_SUBPROJECT)
    add_subdirectory(doc)
endif()

オンラむンサンドボックス

同様に、サブプロゞェクトにもオンラむン サンドボックスはありたせん。

if(NOT IS_SUBPROJECT)
    add_subdirectory(online)
endif()

テスト スクリプト (test/CMakeLists.txt)

テスト

たず、必芁なテスト フレヌムワヌクを含むパッケヌゞを芋぀けたす (お気に入りのものに眮き換えたす)。

find_package(doctest 2.3.3 REQUIRED)

テストを含む実行可胜ファむルを䜜成したしょう。 通垞、関数を含むファむルのみを実行可胜バむナリに盎接远加したす。 main.

add_executable(mylib-unit-tests test_main.cpp)

そしお、テスト自䜓を埌で説明するファむルを远加したす。 しかし、そんなこずをする必芁はありたせん。

target_sources(mylib-unit-tests PRIVATE mylib/myfeature.cpp)

䟝存関係を結び付けたす。 必芁な CMake タヌゲットのみをバむナリにリンクし、コマンドを呌び出しおいないこずに泚意しおください。 target_include_directories。 テスト フレヌムワヌクず私たちの芋出し Mylib::mylib、ビルド パラメヌタヌ (この堎合、これは C++ 蚀語暙準) も、これらの目暙ずずもに達成されたした。

target_link_libraries(mylib-unit-tests
    PRIVATE
        Mylib::mylib
        doctest::doctest
)

最埌に、ダミヌ タヌゲットを䜜成したす。その「ビルド」はテストの実行に盞圓し、このタヌゲットをデフォルトのビルドに远加したす (属性はこれを担圓したす) ALL。 これは、デフォルトのビルドがテストの実行をトリガヌするこずを意味し、テストの実行を忘れるこずはありたせん。

add_custom_target(check ALL COMMAND mylib-unit-tests)

ППкрытОе

次に、適切なオプションが指定されおいる堎合、コヌド カバレッゞ枬定を有効にしたす。 これらは CMake よりもカバレッゞを枬定するツヌルに関連するため、詳现には觊れたせん。 結果に基づいお目暙が䜜成されるこずに泚意しおください。 coverageこれを䜿甚するず、カバレッゞの枬定を開始するのに䟿利です。

find_program(GCOVR_EXECUTABLE gcovr)
if(MYLIB_COVERAGE AND GCOVR_EXECUTABLE)
    message(STATUS "ИзЌереМОе пПкрытОя кПЎа тестаЌО включеМП")

    target_compile_options(mylib-unit-tests PRIVATE --coverage)
    target_link_libraries(mylib-unit-tests PRIVATE gcov)

    add_custom_target(coverage
        COMMAND
            ${GCOVR_EXECUTABLE}
                --root=${PROJECT_SOURCE_DIR}/include/
                --object-directory=${CMAKE_CURRENT_BINARY_DIR}
        DEPENDS
            check
    )
elseif(MYLIB_COVERAGE AND NOT GCOVR_EXECUTABLE)
    set(MYLIB_COVERAGE OFF)
    message(WARNING "Для заЌерПв пПкрытОя кПЎа тестаЌО требуется прПграЌЌа gcovr")
endif()

ドキュメント甚のスクリプト (doc/CMakeLists.txt)

ドキシゲンを芋぀けたした.

find_package(Doxygen)

次に、ナヌザヌが蚀語倉数を蚭定したかどうかを確認したす。 「はい」の堎合は觊れたせんが、そうでない堎合はロシア語を䜿甚したす。 次に、Doxygen システム ファむルを構成したす。 蚀語を含む必芁なすべおの倉数は、構成プロセス䞭にそこに移動したす (「. кПЌаМЎу configure_file).

次に、目暙を䜜成したす doc、ドキュメントの生成が開始されたす。 開発プロセスではドキュメントの生成が最倧のニヌズではないため、タヌゲットはデフォルトでは有効化されず、明瀺的に起動する必芁がありたす。

if (Doxygen_FOUND)
    if (NOT MYLIB_DOXYGEN_LANGUAGE)
        set(MYLIB_DOXYGEN_LANGUAGE Russian)
    endif()
    message(STATUS "Doxygen documentation will be generated in ${MYLIB_DOXYGEN_LANGUAGE}")
    configure_file(Doxyfile.in Doxyfile)
    add_custom_target(doc COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
endif ()

オンラむンサンドボックス甚のスクリプト (online/CMakeLists.txt)

ここで XNUMX 番目の Python を芋぀けおタヌゲットを䜜成したす wandbox、サヌビス API に察応するリク゚ストを生成したす ワンドボックスず送り返したす。 応答には、完成したサンドボックスぞのリンクが含たれおいたす。

find_program(PYTHON3_EXECUTABLE python3)
if(PYTHON3_EXECUTABLE)
    set(WANDBOX_URL "https://wandbox.org/api/compile.json")

    add_custom_target(wandbox
        COMMAND
            ${PYTHON3_EXECUTABLE} wandbox.py mylib-example.cpp "${PROJECT_SOURCE_DIR}" include |
            curl -H "Content-type: application/json" -d @- ${WANDBOX_URL}
        WORKING_DIRECTORY
            ${CMAKE_CURRENT_SOURCE_DIR}
        DEPENDS
            mylib-unit-tests
    )
else()
    message(WARNING "Для сПзЎаМОя ПМлайМ-песПчМОцы требуется ОМтерпретатПр ЯП python 3-й версОО")
endif()

屋倖でのプロゞェクト

それでは、これらすべおの䜿甚方法を芋おみたしょう。

組立

このプロゞェクトのビルドは、CMake ビルド システム䞊の他のプロゞェクトず同様に、次の XNUMX ぀の段階で構成されたす。

䞖代

cmake -S путь/к/ОсхПЎМОкаЌ -B путь/к/сбПрПчМПй/ЎОректПрОО [ПпцОО ...]

CMake のバヌゞョンが叀いために䞊蚘のコマンドが機胜しなかった堎合は、省略しおみおください。 -S:

cmake путь/к/ОсхПЎМОкаЌ -B путь/к/сбПрПчМПй/ЎОректПрОО [ПпцОО ...]

オプションの詳现.

プロゞェクトの構築

cmake --build путь/к/сбПрПчМПй/ЎОректПрОО [--target target]

アセンブリの目暙の詳现.

オプション

MYLIB_COVERAGE

cmake -S ... -B ... -DMYLIB_COVERAGE=ON [прПчОе ПпцОО ...]

タヌゲットを含む coverageこれを䜿甚しお、テストによるコヌド カバレッゞの枬定を開始できたす。

MYLIB_TESTING

cmake -S ... -B ... -DMYLIB_TESTING=OFF [прПчОе ПпцОО ...]

単䜓テストのビルドずタヌゲットを無効にする機胜を提䟛したす check。 その結果、テストによるコヌド カバレッゞの枬定はオフになりたす (「. MYLIB_COVERAGE).

コマンドを䜿甚しおプロゞェクトがサブプロゞェクトずしお別のプロゞェクトに接続されおいる堎合も、テストは自動的に無効になりたす。 add_subdirectory.

MYLIB_DOXYGEN_LANGUAGE

cmake -S ... -B ... -DMYLIB_DOXYGEN_LANGUAGE=English [прПчОе ПпцОО ...]

タヌゲットが生成するドキュメントの蚀語を切り替えたす。 doc 䞎えられたものに。 利甚可胜な蚀語のリストに぀いおは、を参照しおください。 Doxygen システムの Web サむト.

ロシア語はデフォルトで有効になっおいたす。

組み立お察象

ППуЌПлчаМОю

cmake --build path/to/build/directory
cmake --build path/to/build/directory --target all

タヌゲットが指定されおいない堎合 (タヌゲットず同等) all、可胜な限りすべおを収集し、タヌゲットを呌び出したす check.

mylib-単䜓テスト

cmake --build path/to/build/directory --target mylib-unit-tests

単䜓テストをコンパむルしたす。 デフォルトで有効になっおいたす。

チェック

cmake --build путь/к/сбПрПчМПй/ЎОректПрОО --target check

収集された (ただ収集されおいない堎合は) 単䜓テストを実行したす。 デフォルトで有効になっおいたす。

СЌ。 также mylib-unit-tests.

カバレッゞ

cmake --build путь/к/сбПрПчМПй/ЎОректПрОО --target coverage

プログラムを䜿甚したテストによるコヌド カバレッゞに぀いお、実行䞭の単䜓テスト (ただ実行されおいない堎合は実行) を分析したす。 gcovr.

コヌティングの排気は次のようになりたす。

------------------------------------------------------------------------------
                           GCC Code Coverage Report
Directory: /path/to/cmakecpptemplate/include/
------------------------------------------------------------------------------
File                                       Lines    Exec  Cover   Missing
------------------------------------------------------------------------------
mylib/myfeature.hpp                            2       2   100%   
------------------------------------------------------------------------------
TOTAL                                          2       2   100%
------------------------------------------------------------------------------

タヌゲットは、オプションが有効な堎合にのみ䜿甚できたす。 MYLIB_COVERAGE.

СЌ。 также check.

DOC

cmake --build путь/к/сбПрПчМПй/ЎОректПрОО --target doc

システムを䜿甚しおコヌドドキュメントの生成を開始したす ドキシゲン.

ワンドボックス

cmake --build путь/к/сбПрПчМПй/ЎОректПрОО --target wandbox

サヌビスからの応答は次のようになりたす。

{
    "permlink" :    "QElvxuMzHgL9fqci",
    "status" :  "0",
    "url" : "https://wandbox.org/permlink/QElvxuMzHgL9fqci"
}

このサヌビスはこのために䜿甚されたす ワンドボックス。 圌らのサヌバヌがどれほど柔軟であるかはわかりたせんが、この機䌚を悪甚すべきではないず思いたす。

䟋

カバレッゞ枬定を䜿甚しおデバッグ モヌドでプロゞェクトをビルドする

cmake -S путь/к/ОсхПЎМОкаЌ -B путь/к/сбПрПчМПй/ЎОректПрОО -DCMAKE_BUILD_TYPE=Debug -DMYLIB_COVERAGE=ON
cmake --build путь/к/сбПрПчМПй/ЎОректПрОО --target coverage --parallel 16

事前の組み立おやテストを行わずにプロゞェクトをむンストヌルする

cmake -S путь/к/ОсхПЎМОкаЌ -B путь/к/сбПрПчМПй/ЎОректПрОО -DMYLIB_TESTING=OFF -DCMAKE_INSTALL_PREFIX=путь/к/устаМПвПйМПй/ЎОректПрОО
cmake --build путь/к/сбПрПчМПй/ЎОректПрОО --target install

指定されたコンパむラを䜿甚しおリリヌス モヌドでビルドする

cmake -S путь/к/ОсхПЎМОкаЌ -B путь/к/сбПрПчМПй/ЎОректПрОО -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_PREFIX_PATH=путь/к/ЎОректПрОО/куЎа/устаМПвлеМы/завОсОЌПстО
cmake --build путь/к/сбПрПчМПй/ЎОректПрОО --parallel 4

英語でのドキュメントの䜜成

cmake -S путь/к/ОсхПЎМОкаЌ -B путь/к/сбПрПчМПй/ЎОректПрОО -DCMAKE_BUILD_TYPE=Release -DMYLIB_DOXYGEN_LANGUAGE=English
cmake --build путь/к/сбПрПчМПй/ЎОректПрОО --target doc

ツヌル

  1. CMake 3.13

    実際、CMake バヌゞョン 3.13 は、このヘルプで説明されおいるコン゜ヌル コマンドの䞀郚を実行する堎合にのみ必芁です。 CMake スクリプトの構文の芳点から芋るず、生成が他の方法で呌び出される堎合は、バヌゞョン 3.8 で十分です。

  2. テストラむブラリ ドクタヌテスト

    テストは無効にするこずができたす (「 ПпцОю MYLIB_TESTING).

  3. ドキシゲン

    ドキュメントを生成する蚀語を切り替えるためのオプションが提䟛されおいたす。 MYLIB_DOXYGEN_LANGUAGE.

  4. 蚀語通蚳者 Pythonの3

    自動生成の堎合 オンラむンサンドボックス.

静的解析

CMake ずいく぀かの優れたツヌルを䜿甚するず、最小限の劎力で静的分析を行うこずができたす。

Cppチェック

CMake には静的分析ツヌルのサポヌトが組み蟌たれおいたす Cppチェック.

これを行うには、オプションを䜿甚する必芁がありたす CMAKE_CXX_CPPCHECK:

cmake -S путь/к/ОсхПЎМОкаЌ -B путь/к/сбПрПчМПй/ЎОректПрОО -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_CPPCHECK="cppcheck;--enable=all;-Iпуть/к/ОсхПЎМОкаЌ/include"

これ以降、゜ヌスがコンパむルおよび再コンパむルされるたびに、静的解析が自動的に開始されたす。 远加で䜕もする必芁はありたせん。

クラン

玠晎らしいツヌルの助けを借りお scan-build 静的分析をすぐに実行するこずもできたす。

scan-build cmake -S путь/к/ОсхПЎМОкаЌ -B путь/к/сбПрПчМПй/ЎОректПрОО -DCMAKE_BUILD_TYPE=Debug
scan-build cmake --build путь/к/сбПрПчМПй/ЎОректПрОО

ここでは、Cppcheck の堎合ずは異なり、毎回ビルドを実行する必芁がありたす。 scan-build.

埌曞き

CMake は、あらゆる奜みや色に合わせた機胜を実装できる、非垞に匷力で柔軟なシステムです。 そしお、構文には改善の䜙地がある堎合もありたすが、悪魔は描かれおいるほど恐ろしいものではありたせん。 瀟䌚ず健康のために CMake ビルド システムを䜿甚しおください。

→ プロゞェクトテンプレヌトをダりンロヌド

出所 habr.com

コメントを远加したす