В этой заметке я хочу рассмотреть тему сборки проектов использующих библиотеки Boost. Мы рассмотрим проект из исполняемого файла использующего Boost Thread и двух библиотек использующих Boost Unit Test Framework.
Первым делом необходимо установить значения переменных отвечающих за тип линковки библиотек (статическая или динамическая):
set (Boost_USE_STATIC_LIBS ON) |
И использование многопоточности библиотеками:
set (Boost_USE_MULTITHREADED ON) |
После этого можно выполнить уже знакомую по заметке о CMake и QT команду find_package:
find_package (Boost COMPONENTS список_нужных_модулей REQUIRED) |
Дополнительно можно указать необходимую версию Boost:
find_package (Boost 1.35.0 COMPONENTS список_нужных_модулей REQUIRED) |
В случае если Boost корректно установлен, результатом работы команды будет создание переменных содержащих директории с заголовочными файлами Boost и пути к необходимым библиотекам:
include_directories(${Boost_INCLUDE_DIRS}) ... target_link_libraries (${PROJECT} ${Boost_LIBRARIES}) |
Дополнительная информация
На некоторых платформах могут возникать ошибки линковки при использовании многопоточности. Для решения данной проблемы необходимо добавить следующую команду:
find_package (Threads) ... target_link_libraries (${PROJECT} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) |
Пример готового файла для CMake
cmake_minimum_required (VERSION 2.6) set (PROJECT test) set (HEADERS ../test.h) set (SOURCES ../test.cpp) set (BOOST_COMPONENTS thread filesystem) set (Boost_USE_STATIC_LIBS ON) set (Boost_USE_MULTITHREADED ON) project (${PROJECT}) include_directories (../) find_package (Threads) find_package (Boost COMPONENTS ${BOOST_COMPONENTS} REQUIRED) include_directories(${Boost_INCLUDE_DIRS}) add_executable (${PROJECT} ${HEADERS} ${SOURCES}) target_link_libraries (${PROJECT} ${CMAKE_THREAD_LIBS_INIT} ${Boost_LIBRARIES}) |
Шаблон для сборки приложения использующего Boost
В архиве находится шаблон CMake-файла используя который вы сможете быстро создать проект использующий Boost. Просто отредактируйте несколько переменных находящихся в самом начале файла:
set (PROJECT имя_проекта) set (HEADERS список_заголовочных_файлов) set (SOURCES список_файлов_с_реализацией) set (LIBRARIES список_библиотек) set (BOOST_COMPONENTS список_модулей) set (Boost_USE_STATIC_LIBS ON) set (Boost_USE_MULTITHREADED ON) |
>В случае если Boost корректно установлен
Я правильно понимаю что если не корректно установлен единственный способ это руками прописывать к нему путь?
Begemot
4 марта 10 17:19
Правильно. А еще установить правильно для Windows — это прописать в системную переменную путь к корневой директории boost (надо убедиться, что boost был собран), остальное модуль find_boost сделает сам.
Максим Тремпольцев
4 марта 10 20:42
>В случае если Boost корректно установлен
А что означает корректная установка?
Как будет правильно (корректно) собрать под Windows, ну и под Linux/Mac?
В какой системной переменной стоит прописать путь к библиотеке, в Path или создать свою переменную?
Спасибо, Максим.
anton
28 мая 14 10:27
Проще всего с Linux — надо просто установить его менеджером пакетов, если он еще не установлен.
Как собрать его самостоятельно подробно расписано в документации http://www.boost.org/doc/libs/1_55_0/more/getting_started/index.html
Максим Тремпольцев
28 мая 14 10:41
>остальное модуль find_boost сделает сам.
я имел введу каким образом CMake находит библиотеку Boost? т.е. куда нужно прописать путь к источнику либы или этот путь прописывать ненужно?
anton
28 мая 14 10:52
В PATH путь к корневой директории Boost, чтобы нашлись заголовочные файлы и путь к директории с собранными библиотеками (типа stage\lib) чтобы линковщик нашел что нужно.
Максим Тремпольцев
28 мая 14 10:57
find_package, сори..
anton
28 мая 14 10:57
>В PATH путь к корневой директории Boost, чтобы нашлись заголовочные файлы и путь к директории с собранными библиотеками (типа stage\lib) чтобы линковщик нашел что нужно.
Я понял, спасибо Максим.
anton
28 мая 14 10:58
т.е. это нам необходимо чтобы find искал именно статические и мульти либы из всех предлагаемых?
set (Boost_USE_STATIC_LIBS ON)
set (Boost_USE_MULTITHREADED ON)
anton
28 мая 14 11:00
Да
Максим Тремпольцев
28 мая 14 11:07