ctime Ошибка при включении boost :: filesystem - PullRequest
0 голосов
/ 10 июля 2019

Я работаю над небольшим проектом.Важной частью является то, что видео должно быть захвачено, сохранено и перемещено в другую папку.Для видео части я использую FFmpeg , это работает без проблем.Для безопасной информации я использую tinyXML2 .Для копирования и перемещения видеофайлов мне нравится использовать boost .В настоящий момент я работаю над Windows и использую CMake.

Проблема в том, что в момент включения «boost / filesystem» компилятор начинает давать сбой.После использования гугла и анализа сообщений об ошибках я думаю, что есть проблема с заголовками <ctime> или <time>.Файл, который использует <ctime> - это xmltest, который передается tinyxml2.

Но, честно говоря, я очень не понимаю, как и почему это происходит.

Я уже пробовалчтобы изменить порядок включений, как указано здесь .Я пытался исключить файл, который использует ctime, но это невозможно.Я попытался обойти эту проблему, поэтому мне не пришлось использовать Boost, но это сложно из-за независимости платформы.

Файл журнала:

C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(19): error C2039: 'clock_t': is not a member of '`global namespace''
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(19): error C2873: 'clock_t': symbol cannot be used in a using-declaration
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(23): error C2039: 'asctime': is not a member of '`global namespace''
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(23): error C2873: 'asctime': symbol cannot be used in a using-declaration
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(24): error C2039: 'clock': is not a member of '`global namespace''
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(24): error C2873: 'clock': symbol cannot be used in a using-declaration
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(25): error C2039: 'ctime': is not a member of '`global namespace''
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(25): error C2873: 'ctime': symbol cannot be used in a using-declaration
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(26): error C2039: 'difftime': is not a member of '`global namespace''
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(26): error C2873: 'difftime': symbol cannot be used in a using-declaration
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(27): error C2039: 'gmtime': is not a member of '`global namespace''
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(27): error C2873: 'gmtime': symbol cannot be used in a using-declaration
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(28): error C2039: 'localtime': is not a member of '`global namespace''
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(28): error C2873: 'localtime': symbol cannot be used in a using-declaration
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(29): error C2039: 'mktime': is not a member of '`global namespace''
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(29): error C2873: 'mktime': symbol cannot be used in a using-declaration
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(30): error C2039: 'strftime': is not a member of '`global namespace''
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(30): error C2873: 'strftime': symbol cannot be used in a using-declaration
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(31): error C2039: 'time': is not a member of '`global namespace''
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\ctime(31): error C2873: 'time': symbol cannot be used in a using-declaration

Способ, которым яinclude Boost & tinyxml:

find_package(TinyXML2)
find_package(Boost COMPONENTS filesystem system REQUIRED)

...

add_executable(programm ${project_sources}
    ${project_headers}
    ${TINYXML_INC})

target_link_libraries(programm PUBLIC
    Boost::filesystem
    Boost::system
    ${TinyXML2_LIBRARIES})

target_include_directories(programm PRIVATE
    ${Boost_INCLUDE_DIRS}
    ${Boost_LIBRARY_DIRS}
    ${TinyXML2_INCLUDE_DIR})

target_link_directories(programm PUBLIC
    ${Boost_INCLUDE_DIRS}
    ${Boost_LIBRARY_DIRS}
    ${TinyXML2_INCLUDE_DIR})

Включение Boost в Util.h:

#include <string>
#include <boost/filesystem.hpp>

namespace util {
    bool existens_file(std::string* path);
    int existens_directory(std::string* path);

    bool create_directory(std::string* path);
}

Часть в xmltest, где используется <ctime>:

#include "tinyxml2.h"
#include <cerrno>
#include <cstdlib>
#include <cstring>
#include <ctime>

...

XMLDocument* doc = new XMLDocument();
clock_t startTime = clock();
doc->LoadFile( argv[1] );
clock_t loadTime = clock();
int errorID = doc->ErrorID();
delete doc; doc = 0;
clock_t deleteTime = clock();

РЕДАКТИРОВАТЬ После некоторого тестирования я попытался использовать <ctime> в различных файлах без с включением надстройки.В этом случае я также получаю те же проблемы, что и упомянутые выше.

1 Ответ

0 голосов
/ 10 июля 2019

Итак, я исправил проблему, в ffmpeg-library есть файл с именем time.h или Time.h.Ошибка была в том, что случайно связали каталог, содержащий этот файл.

Я не знаю, почему, но с включением boost::filesystem это сработало и использовался временный файл ffmpeg.

Я решил эту проблему, удалив связанный каталог ffmpeg.

...