6

問題:

ブースト数値バインディングをビルドのインクルード ディレクトリとして追加したいと考えています。これは通常、次のようにコンパイルされます。

c++ -I/where/you/want/to/install/it/include/boost-numeric-bindings

プログラムから参照するすべてのヘッダー ファイルはすべて、このディレクトリに対して相対的であるため、CMake では、このディレクトリ (親システムにインストールされている場所) を見つけて、include_directories.

私が探しているもの:

このようなもの:

find_directory(BNB_INCLUDE_DIR boost-numeric-bindings)

include_directories(${BNB_INCLUDE_DIR})

しかし、find_directoryコマンドは存在しません。ここで何か不足していますか?

私が試したこと:

私はもう試した:

find_path(BNB_INCLUDE_DIR boost/numeric/bindings/traits/ublas_vector.hpp)

include_directories(${BNB_INCLUDE_DIR})

(これはライブラリから必要な最初のファイルです)が、これにより、コマンドで指定されたファイルへのプレフィックス全体を含むディレクトリへのパスではなく、ファイルへのフルパスが得られます。

4

1 に答える 1

6

cmake Find ファイルの書き方については、この回答を参照してください。例として、これは私が lm-sensors ライブラリ用に書いたものです:

# - Try to find the LM_SENSORS library.
#
# The following are set after configuration is done: 
#  LM_SENSORS_FOUND
#  LM_SENSORS_INCLUDE_DIRS
#  LM_SENSORS_LIBRARY_DIRS
#  LM_SENSORS_LIBRARIES

find_path(LM_SENSORS_INCLUDE_DIR NAMES sensors/sensors.h)
find_library(LM_SENSORS_LIBRARY NAMES libsensors sensors)

message("LM_SENSORS include dir = ${LM_SENSORS_INCLUDE_DIR}")
message("LM_SENSORS lib = ${LM_SENSORS_LIBRARY}")

set(LM_SENSORS_LIBRARIES ${LM_SENSORS_LIBRARY})
set(LM_SENSORS_INCLUDE_DIRS ${LM_SENSORS_INCLUDE_DIR})

include(FindPackageHandleStandardArgs)
# Handle the QUIETLY and REQUIRED arguments and set the LM_SENSORS_FOUND to TRUE
# if all listed variables are TRUE
find_package_handle_standard_args(LM_SENSORS DEFAULT_MSG
                                  LM_SENSORS_LIBRARY LM_SENSORS_INCLUDE_DIR)

mark_as_advanced(LM_SENSORS_INCLUDE_DIR LM_SENSORS_LIBRARY)

上記をライブラリ ( boost-numeric-bindings) に合わせて変更し、ファイルに名前Findboost-numeric-bindings.cmakeを付けて、cmake モジュール dir に配置します (または、ソース ツリーにこれらのいずれかを作成します)。

次に、CMakeLists.txtファイルで次のようにします。

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} your_cmake_module_dir)
find_package (boost-numeric-bindings REQUIRED)
include_directories(${BOOST_NUMERIC_BINDINGS_INCLUDE_DIR})

次に、ライブラリが標準の場所にインストールされていないと仮定して、次のように cmake を実行します。

cmake -D CMAKE_PREFIX_PATH:STRING="/where/you/have/installed/it/" <source path>

編集

find_pathまたはを呼び出す前に、プロジェクトが定義されていることを確認してくださいfind_package。それ以外の場合CMAKE_SYSTEM_INCLUDE_PATHは設定されません。例えば:

find_path (BOOST_STATE_HPP boost/statechart/state.hpp)
message ("CMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH}")
message ("CMAKE_SYSTEM_INCLUDE_PATH=${CMAKE_SYSTEM_INCLUDE_PATH}")
message ("CMAKE_SYSTEM_FRAMEWORK_PATH=${CMAKE_SYSTEM_FRAMEWORK_PATH}")
message ("CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}")
message ("BOOST_STATE_HPP=${BOOST_STATE_HPP}")

project (my_project)

次のcmake出力が得られます。

CMAKE_FIND_ROOT_PATH=
CMAKE_SYSTEM_INCLUDE_PATH=
CMAKE_SYSTEM_FRAMEWORK_PATH=
CMAKE_PREFIX_PATH=
BOOST_STATE_HPP=BOOST_STATE_HPP-NOTFOUND

これに対して:

project (my_project)

find_path (BOOST_STATE_HPP boost/statechart/state.hpp)
message ("CMAKE_FIND_ROOT_PATH=${CMAKE_FIND_ROOT_PATH}")
message ("CMAKE_SYSTEM_INCLUDE_PATH=${CMAKE_SYSTEM_INCLUDE_PATH}")
message ("CMAKE_SYSTEM_FRAMEWORK_PATH=${CMAKE_SYSTEM_FRAMEWORK_PATH}")
message ("CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}")
message ("BOOST_STATE_HPP=${BOOST_STATE_HPP}")

必要に応じて、を見つけstate.hppて に設定BOOST_STATE_HPPすることに成功/usr/includeします。

CMAKE_FIND_ROOT_PATH=
CMAKE_SYSTEM_INCLUDE_PATH=/usr/include/w32api;/usr/X11R6/include;/usr/include/X11;/usr/pkg/include;/opt/csw/include;/opt/include;/usr/openwin/include
CMAKE_SYSTEM_FRAMEWORK_PATH=
CMAKE_PREFIX_PATH=
BOOST_STATE_HPP=/usr/include
于 2013-10-10T17:51:10.163 に答える