Как правильно настроить буст-тест с помощью cmake

Boost.Test - очень хорошая библиотека для юнит-тестирования, но всегда, когда я пытаюсь настроить ее в новом проекте, это большая проблема.

Как настроить мой проект, использующий cmake, для использования boost с соблюдением следующих требований (это действительно список того, что мне не понравилось в большинстве получателей, которые я нашел в Интернете):

  • Я не хочу использовать один вариант заголовка UTF (то есть я не хочу включать boost/test/included/unit_test.hpp). Основанием для этого является то, что он замедляет как компиляцию, так и IDE.
  • Я действительно не хочу писать main функция - если только это не одна строка (я не нашел никаких способов копирования-вставки, чтобы определить основную функцию). Поэтому, если вы не можете предоставить такой основной фрагмент, это означает, что Boost.Test связан статически.
  • Я не хочу включать все статически (через -static gcc switch). Я также не хочу компилировать каждый компонент повышения статически.
  • Я не хочу жестко задавать какие-либо пути к библиотекам в моей конфигурации cmake.

Так вот test.cpp Я хочу использовать:

#define BOOST_TEST_MODULE ExampleTest
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_SUITE(ExampleSuite)

BOOST_AUTO_TEST_CASE( my_test )
{
    BOOST_CHECK(true);
}

BOOST_AUTO_TEST_SUITE_END()

А тут все просто (не работает!) CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.11)
project(example)
add_executable(simple-test tests.cpp)

3 ответа

Решение

На самом деле я не нашел никакого конкретного решения, которое бы удовлетворяло моим потребностям, но вот два частичных решения, которые в основном подходят.

Явная ссылка статически на libboost_unit_test_framework.a:

В этом случае CMakeLists.txt выглядит так:

cmake_minimum_required(VERSION 2.8.11)
project(example)
ADD_LIBRARY(boost_unit_test_framework STATIC IMPORTED)
SET_TARGET_PROPERTIES(boost_unit_test_framework PROPERTIES
    IMPORTED_LOCATION /usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.a)
add_executable(simple-test tests.cpp)
target_link_libraries(simple-test boost_unit_test_framework)

Недостатки в том, что я явно ссылаюсь на /usr/lib/x86_64-linux-gnu/libboost_unit_test_framework.a который может измениться (я думаю).

использование find_packages

cmake_minimum_required(VERSION 2.8.11)
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost COMPONENTS unit_test_framework REQUIRED)
add_executable(simple-test tests.cpp)
target_link_libraries(simple-test ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY})

Тяги для этого есть, что (насколько я понимаю set(Boost_USE_STATIC_LIBS ON) принудительно статически связывает все компоненты буста, что может быть нежелательно.

Я использую это:

cmake_minimum_required(VERSION 2.8.11)

# disable auto link
add_definitions(-DBOOST_ALL_NO_LIB)

# link against dynamic libraries
add_definitions(-DBOOST_ALL_DYN_LINK)
find_package(Boost COMPONENTS system unit_test_framework)

в качестве преамбулы перед загрузкой библиотеки boost.test, и она работает как положено.

Вы можете создать свою собственную общую версию Boost UTF в своем проекте (статический также будет работать).

add_library(my_boost_test SHARED boost_test.cpp)

С этим boost_test.cpp:

#include <boost/test/included/unit_test.hpp>
Другие вопросы по тегам