2012-03-17 4 views
1

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

Вот мой минимальный исходный файл, 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. Мне все равно, связано ли это динамически или статически, я просто хочу, чтобы он работал.

ответ

2

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

link_directories (${Boost_LIBRARY_DIRS}) 

перед тем add_executable.

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

2

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

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

target_link_libraries(test ${Boost_LIBRARIES}) 
0

Ну вот, проблема заключается не в том, что CMake не находит boost_unit_test_framework библиотеку, а то, что эта конкретная библиотека не содержит main точка входа для запуска двоичного файла.

Фактически, вы должны установить ссылку на ${Boost_TEST_EXEC_MONITOR_LIBRARY}, так как она содержит правильные определения. Вы также должны избегать определения макроса BOOST_TEST_DYN_LINK.

+0

Обратите внимание, что 'Boost_TEST_EXEC_MONITOR_LIBRARY' не существует (по крайней мере) для FindBoost.cmake для cmake версии> 3.x. –