2009-06-30 4 views
11

Je construis mon programme C++ avec cmake sur un Mac. Le compilateur me donne l'erreur suivante:Pourquoi ce fichier d'en-tête boost n'est pas inclus

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

La ligne qui déclenche l'erreur est la suivante:

#include "boost/filesystem.hpp" 

ou

#include <boost/filesystem.hpp> 

Lequel de ce qui précède, je ne l'utilise pas changé le Erreur

Mais dans mon CMakeLists.txt j'inclus les en-têtes 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 

Pendant l'exécution de 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 choisit pas le répertoire/opt/local/include?

Si vous avez besoin de plus amples informations, je suis heureux de fournir

+0

Cela semble bien, que dit "ls /opt/local/include/boost/filesystem.hpp"? –

+1

Assurez-vous que le répertoire include_directories ($ {Boost_INCLUDE_DIRS}) est répertorié _avant_les instructions add_executable ou add_library sont atteintes. –

+0

Merci ... cela semble aider maintenant, je reçois une erreur de boost au moment de la compilation. J'ai ajouté le sous-répertoire avec l'instruction exécutable avant l'include, sans savoir que cmake va à ce moment tout appliquer dans ce sous-répertoire. Cela a résolu ce problème au moins – Janusz

Répondre

15

tout d'abord utiliser

FIND_PACKAGE(Boost REQUIRED) 

plutôt que

FIND_PACKAGE(Boost) 

Cette CMake façon vous donnera un beau message d'erreur s'il ne le trouve pas, bien avant que les compilations ne commencent. Si cela échoue, définissez la variable d'environnement BOOST_ROOT sur/opt/local (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}) 

Entrez

cmake --help-module FindBoost 

à la coquille pour obtenir la documentation pour la Boost trouver le module dans votre installation 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; 
} 
+0

Boost_INCLUDE_DIRS:/opt/local/include – Janusz

+0

S'il vous plaît exécuter $ make verbose = 1 et montrez-nous la ligne où le fichier qui échoue est compilé –

+0

Veuillez utiliser http://pastebin.ca/ pour nous envoyer un lien vers un journal complet de vos actions :) –

0

Avez-vous essayé, y compris filesystem.hpp sans la partie "boost /"?

+7

Tous les fichiers d'en-têtes dans boost font leurs include comme #include , donc si ne fonctionne pas, rien ne fonctionne! –

+0

oui ne travaillait pas non plus – Janusz

0

J'ai résolu un problème similaire en ajoutant des 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}) 
Questions connexes