Неопределенные ссылочные ошибки в простой ускоренной сериализации - PullRequest
1 голос
/ 25 мая 2020

У меня есть минимальный пример сериализации Boost, где я пытаюсь сохранить целое число в файле двоичного архива.

Вот main. cpp:

#include <iostream>
#include <fstream>
#include <boost/archive/binary_oarchive.hpp>

int main() {
    int t = 0;
    std::ofstream file("Test.bin");
    boost::archive::binary_oarchive archive(file);
    archive << t;
    file.close();
    return 0;
}

и вот Файл CMake:

cmake_minimum_required(VERSION 3.15)
project(Test)

set(CMAKE_CXX_STANDARD 17)
find_package(Boost REQUIRED serialization)
add_executable(Test main.cpp)
if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    target_link_libraries(Test ${Boost_LIBRARIES})
endif()

Когда я пытаюсь запустить эту программу в CLion, я получаю большой список неопределенных ссылочных ошибок, как показано здесь: https://pastebin.com/8uX9MZFf

Я установил Boost с помощью диспетчера пакетов vcpkg. Компилирую с помощью Mingw-w64. Файл CMake загружается без ошибок (только предупреждение, в котором говорится: «Новая версия Boost может иметь неправильные или отсутствующие зависимости и импортированные цели», хотя я слышал, что это предупреждение не вызывает беспокойства, поскольку это означает, что текущая версия CMake не не знаю о новейшей версии Boost).

Я пытался найти решения этой проблемы повсюду, но, похоже, я не могу найти здесь ничего, что работает. Любая помощь приветствуется.

Я использую cmake 3.15.3, boost 1.73.0 и mingw-w64 6.0.

EDIT

Я удалил и переустановил Boost без использования диспетчера пакетов и снова попытался получить библиотеку сериализации. В этом контексте CMake сталкивается с ошибками, говоря, что не может найти Boost с сериализацией (хотя он может найти только Boost). Я установил Boost_DEBUG на ON, посмотрел на вывод и заметил следующее:

_boost_COMPILER = "-mgw81" (guessed) Кажется, CMake предполагает, что компилятор, который я использовал для компиляции boost, был mgw81. Я предполагаю, что он получил 8.1 из моей версии g cc, что верно.

Searching for SERIALIZATION_LIBRARY_RELEASE: boost_serialization-mgw81-mt-x64-1_73;boost_serialization-mgw81-mt-x64;...

В результате выбора компилятора он ищет файл с " -mgw81 "в имени. Проблема в том, что файлы библиотеки, созданные при создании ускорения, называются так:

libboost_serialization-mgw8-mt-x64-1_73.a

Здесь написано «-mgw8» вместо «-mgw81». Я не знаю, как исправить CMake или построить Boost таким образом, чтобы этого конфликта не было. Я пробовал перестроить boost с помощью toolset=gcc-8.1 вместо toolset=gcc, но я все еще получаю «-mgw8» в именах файлов библиотеки.

EDIT 2

Я нашел решение вышеуказанной проблемы. Я разместил это ниже.

1 Ответ

1 голос
/ 26 мая 2020

Поняв, что проблема заключалась в том, что я упомянул в EDIT , я дополнительно изучил, как можно решить эту проблему, и обнаружил, что вы можете вручную установить компилятор, который используется для поиска по переменной Boost_COMPILER.

Я изменил свой файл CMake на следующий:

cmake_minimum_required(VERSION 3.15)
project(Test)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "C:/boost_1_73_0")
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "C:/boost_1_73_0/libs")
set(Boost_DEBUG ON)
set(Boost_COMPILER -mgw8)
set(Boost_ARCHITECTURE -x64)
set(BOOST_ROOT C:/boost)
set(BOOST_INCLUDEDIR C:/boost/include/boost-1_73/boost)
set(BOOST_LIBRARYDIR C:/boost/lib)
set(BOOST_NO_SYSTEM_PATHS ON)
find_package(Boost REQUIRED serialization)
add_executable(Test main.cpp)
if(Boost_FOUND)
    include_directories(${Boost_INCLUDE_DIRS})
    target_link_libraries(Test ${Boost_LIBRARIES})
endif()

Я считаю, что критические изменения здесь касались настроек Boost_COMPILER и Boost_ARCHITECTURE. Я понял, что Boost_ARCHITECTURE необходимо установить из этого вопроса: Повышение связывания в проекте CLion .

С этим файлом CMake мой main. cpp файл сверху работал нормально.

...