2

このページconfigure_fileで説明されているように、機能の可用性チェックで Cmakeのコマンドを使用しています。そのページは、次のようなコマンドを使用することを提案しています。

configure_file(config.h.in config.h)

に変換${CMAKE_CURRENT_SOURCE_DIR}/config.h.inされ${CMAKE_CURRENT_BINARY_DIR}/config.hます。しかし、プログラムをコンパイルすると、コンパイラは${CMAKE_CURRENT_SOURCE_DIR}ヘッダー (例: config.h) のみを検索し、${CMAKE_CURRENT_BINARY_DIR}. 当然、コンパイラはconfig.hそれが生成された場所を見つけられず、ビルドは失敗します。

この問題を解決する標準的な方法は何ですか? ソースディレクトリに作成されるCMakeLists.txtように変更する必要がありますか? config.hまたは、ビルド ディレクトリをインクルード パスに追加するように変更する必要がありますか? (そして、実際には、なぜこれを手動で処理しなければならないのでしょうか? [半修辞的な質問])

この質問は同様の問題に関するものですが、可能な解決策として両方のオプションが提案されています。標準的な慣行があるかどうか、またはこれが Cmake の使用方法について何かが欠けていることを示しているかどうかを知りたいです。

4

2 に答える 2

6

たとえば、複数の異なるビルドを実行したい場合や、ビルド dir (ないソースディレクトリに何かを生成している場合は十分です)。

ビルド ディレクトリに生成し、インクルード パスを追加します。

変数を設定する

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)

各ソースディレクトリの対応するビルドディレクトリを自動的に追加し、それを他のターゲットが消費する推移的な動作にします (たとえばfoo、ビルドディレクトリを明示的に追加する必要はありません)。bar

http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html#build-specification-and-usage-requirements

于 2014-09-25T05:52:24.163 に答える
3

これを処理するための標準的な方法はないと思いますが、他のプロジェクトに対する私自身の限られた見方からすると、いずれにせよ圧倒的多数はないようです。推測すると、生成されたファイルをソース ツリーではなくビルド ツリーに配置する方が一般的だと思います。

私自身の好みは${CMAKE_CURRENT_BINARY_DIR}/GeneratedFiles/config.h、わかりやすくするためにサブディレクトリに配置することです。${CMAKE_CURRENT_BINARY_DIR}これにより、Visual Studio などの IDE のオートコンプリート リストにすべてのサブディレクトリが表示されるのを回避できます。また、特に複数のファイルが生成される場合は、ビルド ルートが少しきれいになります。最初にディレクトリを作成する必要があります。

set(GeneratedFilesDir "${CMAKE_CURRENT_BINARY_DIR}/GeneratedFiles")
file(MAKE_DIRECTORY ${GeneratedFilesDir})

set(ConfigFile "${GeneratedFilesDir}/config.h")
configure_file(config.h.in ${ConfigFile})


.ではtarget_include_directoriesなくinclude_directories. たとえば、 config.h が library によって内部的にのみ使用されている場合はMyLib、次のようにすることができます。

add_library(MyLib ${ConfigFile} ... other sources ...)
target_include_directories(MyLib
    PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src ${GeneratedFilesDir}
    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

を使用する場合とは異なりinclude_directories、これにより、すべてのターゲットが${GeneratedFilesDir}インクルード パスとして指定されなくなります。


生成されたファイルを公開ヘッダーとして公開する必要がある場合、またはコマンドに追加する必要がある場合、事態はさらに議論の余地がありますinstall。最終的に、ここに「間違った」オプションがあるとは思いません。要するに、より複雑な CMake セットアップを犠牲にしてソース ツリーを元の状態に保つ方が良いと感じるかどうかにかかっています。

于 2014-09-25T03:43:54.007 に答える