2009-06-30 10 views
11

Estoy creando mi programa C++ con cmake en una Mac. El compilador me da error siguiente:¿Por qué este archivo de encabezado boost no está incluido?

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

La línea que desencadena el error es el siguiente:

#include "boost/filesystem.hpp" 

o

#include <boost/filesystem.hpp> 

¿Cuál de lo anterior que utilizo no cambió el Error

Pero en mi CMakeLists.txt incluyo los encabezados de impulso de la siguiente manera:

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 incluye directorios está lleno de "/ opt/local/include /" durante el proceso de cmake y esta carpeta contiene un impulso carpeta que contiene el filesystem.hpp

Boost da los siguientes mensajes al tiempo que genera el Makefile, sólo copié la parte impulso:

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

mientras están corriendo VERBOSE = 1 Esta línea contiene el error:

 
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 

¿Entiende por qué el compilador no está eligiendo el directorio/opt/local/include?

Si necesita más información Estoy feliz de proporcionarla

+0

Esto se ve bien, ¿qué dice "ls /opt/local/include/boost/filesystem.hpp"? –

+1

asegúrese de que include_directories ($ {Boost_INCLUDE_DIRS}) esté en la lista _antes de que se alcancen las sentencias add_executable o add_library. –

+0

Gracias ... eso parece ayudar ahora obtengo un error de impulso en tiempo de compilación. Agregué el subdirectorio con la instrucción ejecutable antes de incluir, sin saber que cmake en ese momento aplicará todo en ese subdirectorio. Eso resuelto este problema al menos – Janusz

Respuesta

15

En primer lugar utilizar

FIND_PACKAGE(Boost REQUIRED) 

en lugar de

FIND_PACKAGE(Boost) 

Este cmake manera le dará un mensaje de error agradable si no lo encuentra, mucho antes de que se inicien las compilaciones. Si falla, establezca la variable de entorno BOOST_ROOT en/opt/local (que es el prefijo de instalación). Además, tendrá que enlazar en la biblioteca de sistema de archivos, por lo que desea

FIND_PACKAGE(Boost COMPONENTS filesystem REQUIRED) 

para su uso posterior de

target_link_libraries(mytarget ${Boost_FILESYSTEM_LIBRARY}) 

Introduzca

cmake --help-module FindBoost 

en el shell para obtener la documentación para el Boost encuentra el módulo en tu instalación de cmake.

PD: Un ejemplo

El 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

Por favor, ejecute $ = hacen VERBOSE 1 y muéstrenos la línea donde se compila el archivo que falla –

+0

Utilice http://pastebin.ca/ para enviarnos un enlace a un registro completo de sus acciones :) –

0

¿Has probado incluyendo filesystem.hpp sin el "/ boost" parte?

+7

Todos los archivos de encabezados en boost hacen sus includes como #include , por lo que si no funciona, ¡nada funciona! –

+0

sí tampoco funcionó – Janusz

0

Resolví un problema similar agregando algunas líneas en mi 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}) 
Cuestiones relacionadas