Boost log, GCC 4.4 и CMake - программирование
Подтвердить что ты не робот

Boost log, GCC 4.4 и CMake

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

Компиляция журнала boost и boost успешно прошла, но я продолжаю получать проблемы при связывании моей тестовой программы с 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 действительно правильно определяет библиотеки boost, но я все еще получаю ошибки компоновщика, в основном из формы:

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

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

4b9b3361

Ответ 1

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

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

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})

Ответ 2

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

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

Попробуйте:

SET (CMAKE_THREAD_PREFER_PTHREAD true)
FIND_PACKAGE (Темы)
IF (Threads_FOUND)
INCLUDE_DIRECTORIES (SYSTEM ${Threads_INCLUDE_DIR})
СООБЩЕНИЕ ( "Используем ли мы 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, недействительна.

Попробуйте изменить версию 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()

(Второй конфликт может быть совершенно неправильным, поскольку я считаю, что порядок элементов, указанных после COMPONENTS в FIND_PACKAGE, не имеет значения)