Проект CMake не может связываться с Boost.Test статически или динамически - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь настроить простой проект C ++ с библиотеками CMake и Boost (в данном случае Boost.Test). Я следую этому руководству, за исключением того, что пытаюсь создать статическую ссылку: https://www.jetbrains.com/help/clion/boost-test-support.html. Я установил Boost, используя это руководство: https://www.boost.org/doc/libs/1_73_0/more/getting_started/windows.html и успешно выполнил шаг 5 для создания двоичных файлов библиотеки.

Используя приведенную ниже конфигурацию CMake, я получаю эту ошибку при попытке сборки с помощью cmake --build .:

test1.obj : error LNK2001: unresolved external symbol "public: virtual void __cdecl boost::unit_test::unit_test_log_t::test_start(unsigned long)" (?test_start@unit_test_log_t@unit_test@boost@@UEAAXK@Z)
tests2.obj : error LNK2001: unresolved external symbol "public: virtual void __cdecl boost::unit_test::unit_test_log_t::test_start(unsigned long)" (?test_start@unit_test_log_t@unit_test@boost@@UEAAXK@Z)
MSVCRTD.lib(exe_main.obj) : error LNK2019: unresolved external symbol main referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)

CMakeLists.txt

cmake_minimum_required(VERSION 3.13)
project(cmake_boost_test)

set(CMAKE_CXX_STANDARD 14)

add_executable(cmake_boost_test main.cpp)

add_subdirectory(Boost_tests)

Boost_tests / CMakeLists.txt

set(Boost_DEBUG ON)
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost REQUIRED COMPONENTS unit_test_framework)
include_directories(${Boost_INCLUDE_DIRS})

add_executable(Boost_Tests_run test1.cpp tests2.cpp)
target_link_libraries(Boost_Tests_run ${Boost_LIBRARIES})

Boost_tests / test1. cpp

#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>

Boost_tests / tests2. cpp

#include <boost/test/unit_test.hpp>

1 Ответ

0 голосов
/ 08 мая 2020

В основном есть 3 шага:

  1. ускорение сборки и соответствующие библиотеки и их варианты (см. здесь для Boost.Test)
  2. настройка проекта с CMake (пример здесь )
  3. построить проект

Кажется, у вас есть все шаги, но что усложняет задачу, так это то, что эти 3 шага связаны и должны выполняться согласованно:

  1. Шаг 1 + 2: если вы создаете конкретные c варианты Boost (или Boost.Test) на шаге 1, вы должны проинструктировать CMake с этим вариантом
  2. Шаг 3: при сборке проекта ваша программа кода в некоторых случаях должна быть построена с определениями, указывающими, какой вариант создается. Например, если вы хотите связать с версией общей библиотеки Boost.Test, вы должны определить BOOST_TEST_DYN_LINK (в коде перед любым включением Boost.Test или с target_compile_definitions(test_executable PRIVATE "BOOST_TEST_DYN_LINK=1"))

В случае Boost.Test есть еще одна проблема: на Windows есть функция автосвязки, которая проинструктирует компоновщик автоматически связать с одной версией .lib: это то, что я обычно отключаю, передавая определение BOOST_ALL_NO_LIB.

Если вы можете сделать обнаружение CMake для Boost.Test, я бы не стал беспокоиться вначале обо всех этих проблемах со связью и использовал вариант заголовка , для которого нет проблем с привязкой

Возвращаясь к тому, что у вас есть в настоящее время:

  • ошибка Could NOT find Boost (missing: unit_test_framework) (found version 1.60.0") связана с шагом 1 + 2: CMake не может найти библиотеки с конфигурацией, которую вы указывают. Иногда вам нужно предоставить CMake больше переменных, чтобы он нашел нужные библиотеки, но я предполагаю, что вы просто не создали общий вариант (см. здесь ). Например, иногда я использую Boost_COMPILER и Boost_ARCHITECTURE.
  • Boost_USE_STATIC_LIBS - это инструкция только для CMake: она не требует компиляции вашего файла с правильными определениями.

Если вы опубликуете сообщение об ошибке, которое вы получаете с CMake, передавая -DBoost_DEBUG=ON, мы сможем оказать вам более точную поддержку.

...