5

プロジェクトの長いコーディング セッションを終了するために、私の CPP プロジェクトが複数の OS でコンパイル可能かどうかをテストしたいと思いました。

私は常にWin10で作業しています。正常にコンパイルされます。
ラズベリーパイを使ってみました。正常にコンパイルされます。プロジェクトの別のコピーを Win10 クライアントに再ダウンロードし、cmake-gui を実行して、プロジェクトを開きます。ソリューション エクスプローラーのフォルダー構造がすべてなくなりました。

それで私は掘り下げ始めました、そしてどうやらこの構造はコマンドで CMakeLists.txt に保持されているようsource_groupです。そのため、cmake リストに source_groupings を追加し始めましたが、何らかの理由でグループ化が行われません。

例:
source_group("game\\entitysystem" FILES ${entitysystem_SRC}) // Existing grouping source_group("game\\entitysystem\\components" FILES ${components_SRC}) // My new grouping

私のグロブはこれです:

file(GLOB components_SRC "game/components/*.h" "game/components/*.cpp" )

file(GLOB entitysystem_SRC "game/entitysystem/*.h" "game/entitysystem/*.cpp" )

新しいプロジェクトクローンは正常にコンパイルされるため、GLOB は正しいと思います。Visual Studio のソリューション エクスプローラーの新しい構造のすべての部分が失われているように見えるだけです。はい、Cmake のキャッシュをクリアし、プロジェクトを再生成しました。それを変更しません。

元の構造: 元のフォルダ構造

複製されたプロジェクト構造: 複製されたフォルダー構造

編集:

コンポーネントをエンティティ システムの下に配置しないように、source_group で間違いを犯しましたが、それでも、Visual Studio で作成されたフィルターがないのはなぜですか?

4

1 に答える 1

3

まず、設定していることを確認してくださいset_property(GLOBAL PROPERTY USE_FOLDERS ON)

次に、GLOBソース ファイルのリストを収集するために使用することはお勧めしません。file(GLOBドキュメントから:

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

プロジェクト ファイルをリストする推奨される方法は、CMakeLists.txt に手動で追加することです。

それでもしたい場合GLOBは、ソース ツリーのディレクトリ構造をミラーリングしたいようです。ライブラリまたは実行可能ファイルを定義するすべての場所で、次のようなマクロを使用して、それらを自動的に並べ替えることができます。

foreach(FILE ${SRCS}) 
    # Get the directory of the source file
    get_filename_component(PARENT_DIR "${FILE}" DIRECTORY)

    # Remove common directory prefix to make the group
    string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" GROUP "${PARENT_DIR}")

    # Make sure we are using windows slashes
    string(REPLACE "/" "\\" GROUP "${GROUP}")

    # Group into "Source Files" and "Header Files"
    if ("${FILE}" MATCHES ".*\\.cpp")
       set(GROUP "Source Files${GROUP}")
    elseif("${FILE}" MATCHES ".*\\.h")
       set(GROUP "Header Files${GROUP}")
    endif()

    source_group("${GROUP}" FILES "${FILE}")
endforeach()
于 2016-12-10T23:22:54.143 に答える