2009-06-30 7 views
11

Sto costruendo il mio programma C++ con cmake su un Mac. Il compilatore mi dà seguente errore:Perché non è incluso questo file di intestazione di boost

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

La linea che fa scattare l'errore è il seguente:

#include "boost/filesystem.hpp" 

o

#include <boost/filesystem.hpp> 

Quale di quanto sopra che uso non ha cambiato il Errore

Ma nel mio CMakeLists.txt includo le intestazioni di boost nel modo seguente:

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 includono dirs è pieno di "/ opt/local/include /" durante il processo di CMake e questa cartella contiene una spinta cartella che contiene il filesystem.hpp

Boost dà i seguenti messaggi durante la generazione il Makefile, ho copiato solo la parte spinta:

-- 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 

Durante l'esecuzione di rendere VERBOSE = 1 Questa riga contiene l'errore:

 
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 

Capisci perché il compilatore non sta selezionando la directory/opt/local/include?

Se avete bisogno di ulteriori informazioni sono felice di fornire

+0

Questo sembra, cosa dice "ls /opt/local/include/boost/filesystem.hpp"? –

+1

assicurati che le variabili include_directory ($ {Boost_INCLUDE_DIRS}) siano elencate prima che siano state raggiunte le dichiarazioni add_executable o add_library. –

+0

Grazie ... sembra essere d'aiuto ora ottengo un errore di boost in fase di compilazione. Ho aggiunto la sottodirectory con l'istruzione eseguibile prima dell'inclusione, non essendo consapevole che cmake applicherà in quel momento tutto in quella sottodirectory. Che ha risolto almeno questo problema – Janusz

risposta

15

Prima di tutto utilizzare

FIND_PACKAGE(Boost REQUIRED) 

piuttosto che

FIND_PACKAGE(Boost) 

In questo modo CMake vi darà un messaggio di errore bella se non lo trova, molto prima che vengano avviate le compilazioni. Se fallisce, imposta la variabile d'ambiente BOOST_ROOT su/opt/local (che è il prefisso di installazione). Inoltre si dovrà collegare nella biblioteca filesystem, in modo che si desidera

FIND_PACKAGE(Boost COMPONENTS filesystem REQUIRED) 

per un uso successivo di

target_link_libraries(mytarget ${Boost_FILESYSTEM_LIBRARY}) 

Inserisci

cmake --help-module FindBoost 

alla shell per ottenere la documentazione per la Amplifica il modulo di ricerca nell'installazione di cmake.

PS: Un esempio

Il 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

Eseguire $ fanno VERBOSE = 1 e mostraci la riga in cui è compilato il file che fallisce –

+0

Utilizza http://pastebin.ca/ per inviarci un collegamento a un registro completo delle tue azioni :) –

0

Hai provato tra cui filesystem.hpp senza la "/ boost" parte?

+7

Tutti i file di header in boost fanno il loro include come #include , quindi se non funziona, niente funziona! –

+0

sì non ha funzionato neanche – Janusz

0

Ho risolto un problema simile aggiungendo alcune righe nel mio 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})