2009-06-30 5 views
11

Ich baue mein C++ Programm mit cmake auf einem Mac. Der Compiler gibt mir folgende Fehler:Warum ist diese Boost-Header-Datei nicht enthalten

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

Die Linie, die den Fehler auslöst, ist die folgende:

#include "boost/filesystem.hpp" 

oder

#include <boost/filesystem.hpp> 

Welche der oben Ich benutze nicht verändert nicht die Fehler

Aber in meiner CMakeLists.txt schließe ich die Boost-Header in der folgenden Weise:

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 umfassen dirs mit "/ opt/local/include /" gefüllt ist, während der Cmake Prozess und dieser Ordner enthält einen Ordner Schub, der die filesystem.hpp enthält

-Boost folgende Meldungen gibt beim Generieren das Makefile, ich kopiert nur die Boost-Teil:

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

Während VERBOSE = 1 diese Zeile machen laufen enthält den Fehler:

 
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 

Verstehen Sie, warum der Compiler das Verzeichnis/opt/local/include nicht auswählt?

Wenn Sie weitere Informationen benötigen, bin ich glücklich, es zu bieten

+0

Das sieht gut aus, was sagt "ls /opt/local/include/boost/filesystem.hpp"? –

+1

Stellen Sie sicher, dass die include_directories ($ {Boost_INCLUDE_DIRS}) aufgelistet sind, bevor alle add_executable- oder add_library-Anweisungen erreicht werden. –

+0

Danke ... das scheint mir jetzt zu helfen, bekomme ich einen Boost-Fehler zur Kompilierzeit. Ich habe das Unterverzeichnis mit der ausführbaren Anweisung vor dem Include hinzugefügt, ohne zu wissen, dass cmake in diesem Moment alles in diesem Unterverzeichnis anwenden wird. Das löste zumindest dieses Problem – Janusz

Antwort

15

Zunächst einmal verwenden

FIND_PACKAGE(Boost REQUIRED) 

statt

FIND_PACKAGE(Boost) 

Auf diese Weise cmake wird Ihnen eine nette Fehlermeldung wenn es nicht gefunden wird, lange bevor irgendwelche Zusammenstellungen gestartet werden. Wenn dies fehlschlägt, setzen Sie die Umgebungsvariable BOOST_ROOT auf/opt/local (welches das Installationspräfix ist). Zusätzlich erhalten Sie im Dateisystem-Bibliothek verknüpfen, so dass Sie wollen

FIND_PACKAGE(Boost COMPONENTS filesystem REQUIRED) 

für die spätere Verwendung von

target_link_libraries(mytarget ${Boost_FILESYSTEM_LIBRARY}) 

cmake --help-module FindBoost 

am Shell Geben Sie die Dokumentation für das bekommen Boost find Modul in Ihrer cmake Installation.

PS: Ein Beispiel

Die 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

Bitte führen Sie $ machen VERBOSE = 1 und zeigen Sie uns die Zeile, wo die Datei, die fehlschlägt kompiliert wird –

+0

Bitte verwenden Sie http://pastebin.ca/, um uns einen Link zu einem vollständigen Protokoll Ihrer Aktionen :) –

0

Sie einschließlich filesystem.hpp versucht haben ohne die "boost /" Teil?

+7

Alle Header-Dateien in Boost enthalten ihren Include wie #include , wenn also nicht funktioniert, funktioniert nichts! –

+0

ja hat auch nicht funktioniert – Janusz

0

Ich löste ein ähnliches Problem durch Hinzufügen einiger Zeilen in meiner 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}) 
Verwandte Themen