2013-05-14 2 views
14

Я пытаюсь получить простой пример boost.log, работающий в Linux с использованием GCC 4.4.5, CMake 2.8.2 и Boost 1.53.0.Boost log, GCC 4.4 и CMake

Компиляция журнала буферизации и форсирования успешно завершена, но я продолжаю возникать проблемы при связывании моей тестовой программы с boost.log.

Я использую следующий CMakeLists.txt файл:

cmake_minimum_required(VERSION 2.8) 

project(QuantibBoostLogTest) 

# Include boost headers 
set(Boost_USE_STATIC_LIBS ON) 
set(Boost_USE_MULTITHREADED ON) 
find_package(Threads) 
find_package(Boost 1.53.0 COMPONENTS thread date_time filesystem system log log_setup REQUIRED) 
if(Boost_FOUND) 
    include_directories(${Boost_INCLUDE_DIRS}) 
    link_libraries(${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) 
else(Boost_FOUND) 
    message(FATAL_ERROR "Cannot build Quantib Boost Log test without Boost. Please set Boost_DIR.") 
endif(Boost_FOUND) 

add_executable(quantibBoostLogTest boost_log_test.cxx) 
install(TARGETS quantibBoostLogTest DESTINATION .) 

CMake делает обнаружение библиотеки подталкивания правильно, но я все еще получаю ошибки компоновщика, в основном в виде:

core.cpp:(.text+0x1b0e): undefined reference to `boost::detail::get_tss_data(void const*)' 

я ссылку библиотеки потоков. Кто-нибудь знает, как это решить?

+0

Вы получаете неопределенные ссылки на библиотеку PThreads? –

+2

GCC 4.4 действительно старый (текущий GCC - 4.8). Вы рассматривали обновление? –

+0

Насколько я вижу, у меня нет ошибок, связанных с pthreads. Они были решены путем добавления части FIND (Threads) файла CMake. –

ответ

2

Ошибка компоновщика, связанная с тем, что вы не связываетесь с собственной библиотекой потоков, такой как pthreads и/или boost_thread. (или оба)

1) Из того, что я вижу, вы не связываетесь с библиотекой pthreads.
Просто называя пользовательский модуль CMake, который пытается найти библиотеку, не означает, что он также свяжется с ним.

Try и сделать:

SET (CMAKE_THREAD_PREFER_PTHREAD истина)
FIND_PACKAGE (Threads)
IF (Threads_FOUND)
include_directories (SYSTEM $ {Threads_INCLUDE_DIR})
MESSAGE ("Должны ли мы с помощью Pthreads ? $ {CMAKE_USE_PTHREADS_INIT} ")
TARGET_LINK_LIBRARIES ($ {PROJECT_NAME} $ {CMAKE_THREAD_LIBS_INIT})
ENDIF()

Проверьте, есть ли у FindThreads.cmake файл установки CMake для получения дополнительной информации об использовании модуля потоков. Обычно вы можете найти его в /usr/share/cmake-2.8/Modules/

2) Возможно, заказ связанных библиотек Boost неверен или версия, указанная для Boost, недействительна.

Попробуйте изменить версию наддува или не указывать его вообще или изменить порядок связанных библиотек

SET(Boost_USE_STATIC_LIBS ON) 
SET(Boost_USE_MULTITHREADED ON) 
FIND_PACKAGE(Boost 1.53.0 COMPONENTS **system thread filesystem date_time log log_setup** REQUIRED) 

IF(Boost_FOUND) 
    INCLUDE_DIRECTORIES(SYSTEM ${Boost_INCLUDE_DIR}) 
    LINK_DIRECTORIES(${Boost_LIBRARY_DIR}) 
    MESSAGE("Boost information") 
    MESSAGE("Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}") 
    MESSAGE("Boost_LIBRARY_DIRS: ${Boost_LIBRARY_DIRS}") 
    MESSAGE("Boost Libraries: ${Boost_LIBRARIES}") 
    TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Boost_LIBRARIES}) 
ENDIF() 

(Второе утверждение может быть совершенно неправильно, как я считаю, что порядок элементов, указанных после КОМПОНЕНТЫ в FIND_PACKAGE не имеет значения)

+0

Спасибо за предложения! Я пробовал оба, бот не имел положительного эффекта. В комплект поставки Boost входит и выходной поток библиотеки CMake. Boost_LIBRARIES также кажутся правильными. оптимизирован; /home/c00/boost/boost_1_53_0_install/lib/libboost_system-mt.a; debug; /home/c00/boost/boost_1_53_0_install/lib/libboost_system-mt-d.a; [и т. д.] Выход потоков: Используем ли мы pthreads? 1. Тэг ссылки тегов: -lpthread –

+0

@CoertMetz Как я вижу, вы используете установку без системного расширения Boost, вы установили переменную BOOST_ROOT в правильный путь SET (BOOST_ROOT h ome/c00/boost/boost_1_53_0_install) до FIND_PACKAGE (Boost 1.53.0 ...? Вы также попытались удалить 1.53.0 из FIND_PACKAGE? Также попробуйте запустить ** сделать VERBOSE = 1 ** или ** SET (CMAKE_VERBOSE_MAKEFILE ON) ** в CMakeLists.txt – bitek

+0

Я думаю также может быть несоответствие между заголовками Boost, которые вы используете, и библиотеками Boost, с которыми вы связываетесь, и если у вас есть как системная установка Boost, так и локальная в вашем домашнем каталоге, CMake может запутаться. ** Двойной убедитесь, что вы ссылаетесь на правый boost_thread (-mt или нет) и pthread ** – bitek

20

Кажется, что boost.log зависит от библиотеки boost.thread, тогда вам нужно изменить порядок библиотек.См why link order does matter

Try следующий порядок

find_package(Boost 1.53.0 COMPONENTS log log_setup thread date_time filesystem system REQUIRED) 

, если это не поможет, попробуйте включить их в два раза следующим

link_libraries(${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES} ${Boost_LIBRARIES}) 
Смежные вопросы