3

cppと を使用してプロジェクトからファイルを削除するcmakeninja、最初にビルド ディレクトリを完全に削除して最初からやり直さないと簡単にコンパイルできないことがわかりました。CMake および/または Ninja は、コンパイルするすべてのcppファイルへの多数の参照を削除しているようです。CMake を再実行する前に CMake キャッシュを削除しても、すべての参照が削除されるわけではありません。

これは既知の問題ですか? 解決策はありますか?私は時々 を実行しましrm $(grep -R <filename> <builddir>)たが、それはひどいクラッジです。

編集:この問題を再現できなかったため、間違っていたようです。CMake を手動で再実行すると、ソースのリストを生成するために使用しても、ファイルの正しいリストが常に生成されるように見えます。.cppGLOB

4

1 に答える 1

4

私のコメントを答えに変える

ソースファイルを収集するfile(GLOB ...)

はい、CMake は、file(GLOB ...)コマンドを使用してソース ファイルを収集するときに、新しいソース ファイルまたは削除されたソース ファイルを認識しません。これは CMake の既知の制限です。このため、すべてのソース ファイルを個別にリストするように CMake プロジェクトを変更しました。便宜上、コマンドを使用してヘッダー ファイルを収集していますfile(GLOB ...)

CMake のfile() コマンド ドキュメントからの引用:

ソース ツリーからソース ファイルのリストを収集するために GLOB を使用することはお勧めしません。ソースが追加または削除されたときに CMakeLists.txt ファイルが変更されない場合、生成されたビルド システムは CMake に再生成を要求するタイミングを認識できません。

CMakeCache.txt再トリガー構成への削除

削除CMakeCache.txtするだけでは、CMake 構成を再トリガーするには不十分な場合があります。問題 0014820: すべてのディレクトリを削除する必要があるCMakeCache.txt クレームのみを削除することについてユーザーに警告します。CMakeFiles

私の経験から、CMake 構成を再トリガーする最も信頼できる方法は、プロジェクトCMakeLists.txtファイルの 1 つに触れることです。

注: For CMake は、プロジェクトの CMake を再度便利に実行するためninjaのターゲットを追加します。rebuild_cache

ソース管理からの更新後の再トリガー

ソース管理から削除されたためにソース ファイルが削除された場合、ソース ファイルで引き続き使用できる回避策があるかもしれませんfile(GLOB ...)

たとえば、GIT を使用する場合、次を main に追加できますCMakeLists.txt

configure_file(${CMAKE_SOURCE_DIR}/.git/index ${PROJECT_BINARY_DIR}/git_index.tmp) 

短所:各GIT操作(更新、コミットなど)の構成を再トリガーします。

いくつかの参照:

于 2015-07-02T11:24:20.993 に答える