¿Por qué es este archivo de cabecera impulso no incluido
-
21-08-2019 - |
Pregunta
Estoy construyendo mi programa en C ++ con cmake en un Mac. El compilador me da error siguientes:
error: boost/filesystem.hpp: No such file or directory
La línea que desencadena el error es la 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 las cabeceras boost 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 mientras se 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 se ejecuta hacer 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
¿Entiendes por qué el compilador es no elegir el local de opt / include / /?
Si necesita más información Estoy feliz de proporcionarla
Solución
En primer lugar el uso
FIND_PACKAGE(Boost REQUIRED)
en lugar de
FIND_PACKAGE(Boost)
Esta cmake manera le dará un mensaje de error bueno si no lo encuentra, mucho antes de que se inicien las compilaciones. Si se produce un error establecer el entorno BOOST_ROOT variable para / 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})
Enter
cmake --help-module FindBoost
en el shell para obtener la documentación para el refuerzo encuentran módulo en la 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;
}
Otros consejos
¿Ha tratado de incluir filesystem.hpp sin el "/ boost" parte?
He resuelto un problema similar al añadir 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})