为什么不包括此提升头文件

Jan*_*usz 12 c++ boost compilation cmake

我正在用Mac上的cmake构建我的c ++程序.编译器给我以下错误:

error: boost/filesystem.hpp: No such file or directory
Run Code Online (Sandbox Code Playgroud)

触发错误的行如下:

#include "boost/filesystem.hpp"
Run Code Online (Sandbox Code Playgroud)

要么

#include <boost/filesystem.hpp>
Run Code Online (Sandbox Code Playgroud)

我使用的上述哪一项并没有改变错误

但在我的CMakeLists.txt中,我按以下方式包含了boost标头:

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})
Run Code Online (Sandbox Code Playgroud)

Boost包括目录在cmake进程中填充"/ opt/local/include /",此文件夹包含一个文件夹boost,其中包含filesystem.hpp

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
Run Code Online (Sandbox Code Playgroud)

运行时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: error: boost/filesystem.hpp: No such file or directory
make[2]: *** [src/CMakeFiles/ImageMarker.dir/FaceRecognizer.cpp.o] Error 1

你明白为什么编译器没有选择/ opt/local/include目录吗?

如果您需要更多信息,我很乐意提供

Mai*_*ann 15

首先使用

FIND_PACKAGE(Boost REQUIRED)
Run Code Online (Sandbox Code Playgroud)

而不是

  FIND_PACKAGE(Boost)
Run Code Online (Sandbox Code Playgroud)

这样,如果没有找到它,cmake会给你一个很好的错误信息,早在任何编译开始之前.如果失败,请将环境变量BOOST_ROOT设置为/ opt/local(这是安装前缀).此外,您必须链接文件系统库,因此您需要

FIND_PACKAGE(Boost COMPONENTS filesystem REQUIRED)
Run Code Online (Sandbox Code Playgroud)

供以后使用

target_link_libraries(mytarget ${Boost_FILESYSTEM_LIBRARY})
Run Code Online (Sandbox Code Playgroud)

输入

cmake --help-module FindBoost
Run Code Online (Sandbox Code Playgroud)

在shell中获取cmake安装中Boost查找模块的文档.

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}
)
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)