16

Mac で cmake を使用して C++ プログラムを構築しています。コンパイラは私に次のエラーを与えます:

error: boost/filesystem.hpp: No such file or directory

エラーをトリガーする行は次のとおりです。

#include "boost/filesystem.hpp"

また

#include <boost/filesystem.hpp>

私が使用する上記のどれがエラーを変更しませんでした

しかし、私の CMakeLists.txt には、次の方法でブースト ヘッダーを含めます。

FIND_PACKAGE(Boost) 
MESSAGE("Boost information:") 
MESSAGE("  Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}") 
MESSAGE("  Boost_LIBRARIES: ${Boost_LIBRARIES}") 
MESSAGE("  Boost_LIBRARY_DIRS: ${Boost_LIBRARY_DIRS}") 

INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS})
LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})

Boost インクルード ディレクトリは、cmake プロセス中に「/opt/local/include/」で埋められます。このフォルダには、filesystem.hpp を含むフォルダ boost が含まれます。

Boost は、Makefile の生成中に次のメッセージを表示します。Boost 部分のみをコピーしました。

-- Boost version: 1.38.0
-- Found the following Boost libraries:
Boost information:
Boost_INCLUDE_DIRS: /opt/local/include
Boost_LIBRARIES: 
Boost_LIBRARY_DIRS: /opt/local/lib
-- Configuring done

make VERBOSE=1 の実行中 この行には次のエラーが含まれています。

cd /Users/janusz/Documents/workspace/ImageMarker/Debug/src &&
/usr/bin/c++ -O3 -Wall -Wno-deprecated -g -verbose -I/Users/janusz/Documents/workspace/ImageMarker/src/. -o CMakeFiles/ImageMarker.dir/FaceRecognizer.cpp.o -c /Users/janusz/Documents/workspace/ImageMarker/src/FaceRecognizer.cpp
/Users/janusz/Documents/workspace/ImageMarker/src/FaceRecognizer.cpp:8:32: エラー: boost/filesystem.hpp: そのようなファイルまたはディレクトリはありません
make[2]: *** [src/CMakeFiles/ImageMarker.dir/FaceRecognizer.cpp.o] エラー 1

コンパイラが /opt/local/include ディレクトリを選択しない理由がわかりましたか?

さらに情報が必要な場合は、喜んで提供します

4

3 に答える 3

16

まずは使用

FIND_PACKAGE(Boost REQUIRED)

それよりも

  FIND_PACKAGE(Boost)

このようにして、コンパイルが開始されるずっと前に、cmake が見つからない場合、適切なエラー メッセージが表示されます。失敗した場合は、環境変数 BOOST_ROOT を /opt/local (インストール プレフィックス) に設定します。さらに、ファイルシステム ライブラリにリンクする必要があるため、

FIND_PACKAGE(Boost COMPONENTS filesystem REQUIRED)

後で使用するために

target_link_libraries(mytarget ${Boost_FILESYSTEM_LIBRARY})

入る

cmake --help-module FindBoost

シェルで、cmake インストールで Boost find モジュールのドキュメントを取得します。

PS: 例

CMakeLists.txt

cmake_minimum_required(VERSION 2.6)
project(Foo)

find_package(Boost COMPONENTS filesystem REQUIRED)

include_directories(${Boost_INCLUDE_DIRS})
add_executable(foo main.cpp)
target_link_libraries(foo 
  ${Boost_FILESYSTEM_LIBRARY}
)

main.cpp

#include <boost/filesystem.hpp>
#include <vector>
#include <string>
#include <cstdio>
#include <cstddef>

namespace fs = boost::filesystem;
using namespace std;

int main(int argc, char** argv)
{
  vector<string> args(argv+1, argv+argc);
  if(args.empty())
  {
    printf("usage: ./foo SOME_PATH\n");
    return EXIT_FAILURE;
  }

  fs::path path(args.front());

  if(fs::exists(path))
    printf("%s exists\n", path.string().c_str());
  else
    printf("%s doesn't exist\n", path.string().c_str());

  return EXIT_SUCCESS;
}
于 2009-06-30T18:22:08.583 に答える
1

CMakeLists.txt にいくつかの行を追加して、同様の問題を解決しました。

cmake_minimum_required(VERSION 3.5)
project(MyResource)

function(myresources out_var)
    set(RESULT)
    foreach(in_f ${ARGN})
        file(RELATIVE_PATH src_f ${CMAKE_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/${in_f})
        set(out_f "${PROJECT_BINARY_DIR}/${in_f}.c")
        add_custom_command(OUTPUT ${out_f}
                COMMAND myresource ${out_f} ${src_f}
                DEPENDS ${in_f}
                WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
                COMMENT "Building binary file for ${out_f}"
                VERBATIM)
        list(APPEND result ${out_f})
    endforeach()
    set(${out_var} "${result}" PARENT_SCOPE)
endfunction()

find_package(Boost COMPONENTS filesystem REQUIRED)
find_path(BOOST_FILESYSTEM_INCLUDE_DIRS boost/filesystem.hpp)

add_executable(myresource myresource.cpp)
target_link_libraries(myresource ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY})
target_include_directories(myresource PUBLIC ${BOOST_FILESYSTEM_INCLUDE_DIRS})
于 2016-06-20T02:11:37.113 に答える
0

「boost/」部分なしでfilesystem.hppをインクルードしようとしましたか?

于 2009-06-30T18:22:11.953 に答える