Pourquoi est-ce fichier d'en-tête boost non inclus
-
21-08-2019 - |
Question
Je construis mon c ++ programme avec CMake sur un Mac. Le compilateur me donne l'erreur suivante:
error: boost/filesystem.hpp: No such file or directory
La ligne qui déclenche l'erreur est le suivant:
#include "boost/filesystem.hpp"
ou
#include <boost/filesystem.hpp>
Laquelle de ce qui précède, je ne l'utilise pas modifié l'erreur
Mais dans mon CMakeLists.txt j'inclure les en-têtes de boost de la façon suivante:
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 comprennent dirs est rempli avec "/ opt / local / include /" au cours du processus de CMake et ce dossier contient un coup de pouce du dossier qui contient le filesystem.hpp
Boost donne les messages suivants tout en générant le Makefile, je ne copiais la partie 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
Lors de l'exécution faire verbose = 1 Cette ligne contient l'erreur:
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
Comprenez-vous pourquoi le compilateur ne sélectionne pas le / opt / local / include?
Si vous avez besoin de plus amples informations, je suis heureux de fournir
La solution
Tout d'abord, l'utilisation
FIND_PACKAGE(Boost REQUIRED)
plutôt que
FIND_PACKAGE(Boost)
Cette CMake façon vous donnera un beau message d'erreur si elle ne trouve pas, bien avant que les compilations sont mis en marche. Si elle ne parvient pas réglé sur / opt / local l'environnement BOOST_ROOT variable (qui est le préfixe d'installation). De plus, vous devrez créer un lien dans la bibliothèque de système de fichiers, si vous voulez
FIND_PACKAGE(Boost COMPONENTS filesystem REQUIRED)
pour une utilisation ultérieure de
target_link_libraries(mytarget ${Boost_FILESYSTEM_LIBRARY})
Entrée
cmake --help-module FindBoost
à la coquille pour obtenir la documentation pour le module trouver Boost dans votre installation de CMake.
PS: Un exemple
Le 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;
}
Autres conseils
Avez-vous essayé, y compris filesystem.hpp sans la partie "boost /"?
Je résolu un problème similaire en ajoutant quelques lignes dans mon 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})