Буст-тест с CMake - неопределенный основной - PullRequest
2 голосов
/ 17 марта 2012

У меня проблемы с созданием небольшой программы, которая использует Boost.Test на моем Mac с Boost, установленным MacPorts на /opt/local/lib/

Вот мой минимальный исходный файл, test.cpp:

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

BOOST_AUTO_TEST_CASE(test1) {
}

и мой CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)
project (test)
find_package(Boost COMPONENTS unit_test_framework REQUIRED)
add_executable(test test.cpp)

и выдержка из make VERBOSE=1:

[100%] Building CXX object CMakeFiles/test.dir/test.cpp.o
g++ -o CMakeFiles/test.dir/test.cpp.o -c /Users/exclipy/Code/cpp/inline_variant/question/test.cpp
Linking CXX executable test
"/Applications/CMake 2.8-5.app/Contents/bin/cmake" -E cmake_link_script CMakeFiles/test.dir/link.txt --verbose=1
g++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/test.dir/test.cpp.o-o test
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
  "vtable for boost::unit_test::unit_test_log_t", referenced from:
      boost::unit_test::unit_test_log_t::unit_test_log_t() in test.cpp.o
      boost::unit_test::unit_test_log_t::~unit_test_log_t() in test.cpp.o
  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.

Как видите, он не знает, какссылка на библиотеку Boost.Поэтому я пытаюсь добавить в CMakeLists.txt:

target_link_libraries(test boost_unit_test_framework)

Но я просто получаю:

g++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/test.dir/test.cpp.o-o test -lboost_unit_test_framework 
ld: library not found for -lboost_unit_test_framework

Из множества проб и ошибок я обнаружил, что ручной запуск этого работает:

$ g++ test.cpp -L/opt/local/lib -lboost_unit_test_framework -DBOOST_TEST_DYN_LINK

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

Ответы [ 3 ]

2 голосов
/ 17 марта 2012

Вызов find_package(Boost COMPONENTS ...) собирает необходимые библиотеки ссылок для найденных компонентов Boost (например, unit_test_framework) в переменной CMake Boost_LIBRARIES.

Чтобы избавиться от ошибки ссылки, добавьте:

target_link_libraries(test ${Boost_LIBRARIES})
2 голосов
/ 17 марта 2012

Вы должны указать CMake, где искать библиотеки повышения (-L/opt/local/lib в вашей строке g ++). Вы можете сделать это, добавив следующую строку (если у вас не было проблем с find_package):

link_directories ( ${Boost_LIBRARY_DIRS} )

до add_executable.

Другой альтернативой является использование варианта UTF с одним заголовком . Этот вариант действительно прост (вам нужно всего лишь включить <boost/test/included/unit_test.hpp>, но он имеет существенный недостаток - значительное увеличение времени сборки.

0 голосов
/ 25 апреля 2013

Здесь проблема не в том, что cmake не находит библиотеку boost_unit_test_framework, а в том, что эта конкретная библиотека не содержит точку входа main для запуска двоичного файла.вам следует ссылаться на ${Boost_TEST_EXEC_MONITOR_LIBRARY}, поскольку он содержит правильные определения.Вам также следует избегать определения макроса BOOST_TEST_DYN_LINK.

...