5

OpenGL 用の非常に軽量なライブラリ/ラッパーを構築していますが、少し問題が発生しました。次のようなディレクトリ構造があるとします。

GraphicsProject
|GraphicsApp
||main.cpp
|GraphicsLib
||include
|||fileA.h
|||fileB.h
||library
|||fileA.cpp
|||fileB.cpp
||shaders
|||shader1.txt
|||shader2.txt
|| build
||| bunch of build stuff

実行時にshader1.txtへのパスを取得する最良の方法は何ですか? または、このプロジェクトを誰が使用しているか、またはユーザーのマシンのどこにあるかに関係なく、パスが変わらないようにしますか?

私が検討したいくつかのオプション: 1) 現在の作業ディレクトリを取得し、そのパスを使用して必要な場所まで作業します。このソリューションに関する私の主な懸念は、ユーザーがプロジェクトをどのようにビルドするか、または私の制御不能なその他の要因に基づいて、現在のディレクトリがどの程度変化するかがわからないことです。エレガントさもあまり感じません。2) シェーダーのソース コードを char 配列/文字列として、include ディレクトリにある .h ファイルに保存します。これはより良い解決策のように思えますが、シェーダーの作成が少し面倒になります。

これを行う標準的な方法はありますか?何か変更があれば、CMake を使用してプロジェクトをビルドしています。

4

1 に答える 1

5

プロジェクトをビルドしている他の開発者が「shaders」フォルダーを使用できるようにすることについて話していると思います。エンドユーザー (installコンポーネントを含む) を意味する場合は、ビルドフォルダーについて話しているわけではないからです。

実行時にシェーダー フォルダーに固定の場所を提供する最も簡単な方法は、ソース ツリーからビルド ツリーにコピーすることだと思います。このようにして、他の開発者は自分のルート ビルド フォルダーをプロジェクトの外部 (必要に応じて内部) の任意の場所に配置でき、アプリはコピーされたシェーダー フォルダーにアクセスするときに処理する単一の固定相対パスを保持します。

コピーしたくない場合は他のオプションがあります (たとえば、CMake で構成ファイルをビルド ツリーに書き込むことができます。構成ファイルはシェーダー フォルダーへのパスを指定できます)。より壊れやすい。いずれにせよ、肝心なのは、構成時 (CMake の実行時) にソース ツリーからビルド ツリーに情報をコピーすることだと思います。これにより、実行時のコードで、潜在的に非常に離れたソース ツリーを探すのが困難になることはありません。

ルート CMakeLists.txt の例は次のようになります。

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(example)

add_executable(GraphicsApp GraphicsApp/main.cpp)
add_library(GraphicsLib
    GraphicsLib/library/fileA.cpp
    GraphicsLib/library/fileB.cpp
    GraphicsLib/include/fileA.h
    GraphicsLib/include/fileB.h
    GraphicsLib/shaders/shader1.txt
    GraphicsLib/shaders/shader2.txt
    )
include_directories(GraphicsLib/include)
target_link_libraries(GraphicsApp GraphicsLib)

add_custom_command(TARGET GraphicsApp POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_directory
        ${CMAKE_SOURCE_DIR}/GraphicsLib/shaders
        $<TARGET_FILE_DIR:GraphicsApp>/shaders)

呼び出しを少し拡張するadd_custom_commandと、これにより基本的に「shaders」サブディレクトリGraphicsAppがビルド先のフォルダーにコピーされます。GraphicsAppコマンドはビルド時にいつでも実行されます。がGraphicsAppビルドされて最新の状態であり、それを再ビルドしようとすると、カスタム コマンドは実行されません。

カスタムコマンドは実際に実行されます

cmake -E copy_directory <path to shaders source> <path to shaders copy>

CMake の-Eクロスプラットフォーム コマンド モードを利用します。

GraphicsAppコマンドの「宛先」部分 (「コピー先」の場所) は、ジェネレータ式を使用して、ビルド先の場所を推測します$<TARGET_FILE_DIR:GraphicsApp>。これはおそらく、その目的を達成するための最も確実な方法です。構成の種類に関係なく、正しいものになります (たとえば、MSVC は "Debug/" または "Release/" フォルダーをビルド パスに挿入します)。

したがって、これにより、目的に最も近づくことができます。実行中のexeへのフルパスを取得して、コピーされたシェーダーフォルダーへのフルパスを推測する必要があると思います。ただし、これは現在の作業ディレクトリから検索するよりもはるかに簡単で堅牢です。現在の作業ディレクトリを計算することさえ簡単ではありません。

于 2013-08-04T20:19:30.067 に答える