17

これは私のプロジェクトツリーです:

project
| + src
| + external
| | + foo
| | | + include
| | | | - foo.hpp
| | | + src
| | | | - foo.cpp
| | | | - CMakeLists.txt
| | | - CMakeLists.txt 
| | + CMakeLists.txt 
| + src
| | - main.cpp
| - CMakeLists.txt

foo.cpp には foo.hpp が含まれています。

// foo.cpp
#include "foo.hpp"

問題は、CMake のトップにディレクトリを含めると foo.hpp が正常に検出されることですが、サブプロジェクトに含めると検出されません。理由はありますか?(ディレクトリは、実行可能ファイルがコンパイルされる前に含まれます)。

// project/CMakeLists.txt
include_directories(external/foo/include) //OK
add_subdirectory(external)

add_executable(main main.cpp)
target_link_libraries(main foo)

// project/external/CMakeLists.txt
add_subdirectory(foo)

// project/external/foo/CMakeLists.txt 
include_directories(include) // NOT WORKING
add_subdirectory(src)

// project/external/foo/src/CMakeLists.txt 
add_library(foo foo.cpp)
4

2 に答える 2

29

のドキュメントを引用するinclude_directories:

インクルード ディレクトリは、現在の CMakeLists ファイルのディレクトリ プロパティ INCLUDE_DIRECTORIES に追加されます。それらは、現在の CMakeLists ファイル内の各ターゲットのターゲット プロパティ INCLUDE_DIRECTORIES にも追加されます。ターゲット プロパティ値は、ジェネレーターによって使用される値です。

INCLUDE_DIRECTORIESディレクトリ プロパティは、ディレクトリ内のすべてのサブディレクトリとすべてのターゲットに継承されます。

  • デフォルトでは、相対パスはこのディレクトリからの相対パスとして解釈される${CMAKE_CURRENT_SOURCE_DIR}ため、 for の指定は冗長です。include_directories読みやすさを向上させるために、それを破棄する必要があります。
  • サブディレクトリとその親の両方にインクルード ディレクトリを指定するのは冗長です。これを避けて、1 つの場所に落ち着く必要があります。
  • get_propertyとを使用しmessageて、すべてのディレクトリとターゲットのINCLUDE_DIRECTORIESプロパティに正しいエントリが含まれていることを再確認します。
  • 最小要件として CMake 2.8.11 を自由に要求できる場合は、include_directories完全に放棄してtarget_include_directories代わりに使用することを検討してください。これには、インクルード依存関係がターゲットごとに排他的に解決されるという利点があり、これは通常、より望ましい動作です。
于 2013-11-15T08:59:07.107 に答える
0

範囲の問題かもしれません。ここであなたがしようとしているのは、 から に設定を伝播し/project/external/foo/CMakeLists/project/CMakeListsこの設定を に伝播できるようにすることだと思います/project/src/CMakeLists。残念ながら、キャッシュされた値を除いて、下位レベルから上位レベルの CMakeLists への伝播は cmake では不可能です。${CMAKE_SOURCE_DIR}/external/foo/includeこれは、 に include_directories( )も追加する必要があることを意味します/project/src/CMakeLists.txt。または、既に行ったように、この行を最上位の CMakeLists に追加するだけです。

于 2013-11-14T17:00:45.610 に答える