web-dev-qa-db-ja.com

Cmake include_directories()

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

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)
16
memecs

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

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

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

  • ${CMAKE_CURRENT_SOURCE_DIR}include_directoriesを指定することは、相対パスがデフォルトでこのディレクトリを基準として解釈されるため、冗長です。読みやすくするために捨てるべきです。
  • サブディレクトリとその親の両方でincludeディレクトリを指定することは冗長です。これを避け、1つの場所で解決する必要があります。
  • get_property および message を使用して、すべてのディレクトリとターゲットがINCLUDE_DIRECTORIESプロパティの正しいエントリで終わることを再確認します。 。
  • 最小要件としてCMake 2.8.11を自由に要求できる場合は、include_directoriesを完全に放棄し、代わりに target_include_directories を使用することを検討してください。これには、通常、より望ましい動作である、ターゲットごとに依存関係が排他的に解決されるという利点があります。
27
ComicSansMS

スコープの問題かもしれません。ここでやろうとしていることは、/project/external/foo/CMakeListsから/project/CMakeListsおよび、この設定を/project/src/CMakeLists。ただし、残念ながら、キャッシュされた値を除き、cmakeでは低レベルから高レベルのCMakeListへの伝播はできません。これは、include_directories(${CMAKE_SOURCE_DIR}/external/foo/include) の中に /project/src/CMakeLists.txt。または、既に行ったように、この行をトップレベルのCMakeListsに追加するだけです。

0
summer.icecream