لماذا هذا زيادة رأس الملف غير المدرجة
-
21-08-2019 - |
سؤال
أنا أبني c++ برنامج مع cmake على ماك.مترجم يعطيني الخطأ التالي:
error: boost/filesystem.hpp: No such file or directory
الخط الذي يطلق الخطأ التالية:
#include "boost/filesystem.hpp"
أو
#include <boost/filesystem.hpp>
مما سبق يمكنني استخدام لا تغير الخطأ
ولكن في بلدي CMakeLists.txt انا تشمل زيادة رؤوس بالطريقة التالية:
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})
دفعة تشمل dirs مليئة "/opt/المحلية/وتشمل/" خلال cmake العملية و يحتوي هذا المجلد على مجلد boost الذي يحتوي على الملفات.hpp
دفعة يعطي الرسائل التالية في حين أن توليد Makefile, أنا فقط نسخ دفعة الجزء:
-- 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
أثناء تشغيل جعل مطول=1 هذا السطر يحتوي على الخطأ:
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
هل تفهم لماذا المترجم لا اختيار /opt/المحلية/تشمل الدليل ؟
إذا كنت بحاجة إلى مزيد من المعلومات يسعدني أن نقدم
المحلول
وأولا وقبل كل استخدام
FIND_PACKAGE(Boost REQUIRED)
وليس
FIND_PACKAGE(Boost)
وبهذه الطريقة cmake سوف تعطيك رسالة خطأ لطيفة إذا لم يجد ذلك، منذ فترة طويلة قبل أن يتم البدء في أي مصنفات. إذا كان فشل تعيين البيئة BOOST_ROOT متغير / الأراضي الفلسطينية المحتلة / المحلية (التي هي البادئة تثبيت). بالإضافة إلى ذلك سيكون لديك لربط في مكتبة الملفات، لذلك تريد
FIND_PACKAGE(Boost COMPONENTS filesystem REQUIRED)
ولاستخدامها لاحقا ل
target_link_libraries(mytarget ${Boost_FILESYSTEM_LIBRARY})
وأدخل
cmake --help-module FindBoost
وفي وعاء للحصول على مستندات لتفعيل تجد وحدة التركيب cmake الخاص بك.
وPS: مثال
وو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;
}
نصائح أخرى
هل حاولت بما في ذلك نظام الملفات.hpp من دون "دفعة/" الجزء ؟
وأنا تحل مشكلة مماثلة عن طريق إضافة بعض الخطوط في بلدي 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})