CMake, boost и библиотеки
От: small_cat Россия  
Дата: 21.09.23 10:03
Оценка:
Здравствуйте.

Перешел на CMake (встала задача кросс-платформенности), переношу проекты с использованием boost. gcc-8, Ubuntu 18.04.
boost 1.78, собран с --layout=versioned.

Путь к boost прописан в системной BOOST_DIR, т.к. в ближайшем будущем понадобятся библиотеки с nanoseconds разрешением, библиотеки собраны в отдельную папку и указаны явно через BOOST_LIBRARYDIR.

Минимальный CMakeLists.txt:

cmake_minimum_required(VERSION 3.8.0)
project(hello VERSION 0.1.0 LANGUAGES C CXX)

set(BOOST_ROOT $ENV{BOOST_DIR})
set(BOOST_LIBRARYDIR "${BOOST_ROOT}/lib-gcc8/lib")

set(Boost_USE_STATIC_LIBS ON) 
set(Boost_USE_MULTITHREADED ON)  
set(Boost_USE_STATIC_RUNTIME OFF) 
# set(Boost_DEBUG ON)

set(Boost_ARCHITECTURE -x64) # без указания архитектуры не работает автопоиск

find_package(Boost REQUIRED COMPONENTS system filesystem)

include(CTest)
enable_testing()

add_executable(hello main.cpp)

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

target_include_directories(hello PUBLIC ${Boost_INCLUDE_DIRS})
target_link_libraries(hello  ${Boost_LIBRARIES} dl)    # без dl не линкуется при использовании boost::dll


Вопросы:
1) как всё таки корректно определять структуру имен при поиске библиотек boost через CMake?
2) как корректно задать CMake, если boost собран с --layout=tagged?
3) почему не линкуется без явного указания dl? В доках нигде необходимость оного не видел, обнаружил путем случайного гугления

Спасибо!
- Простите, профессор, не пса, а когда он уже был человеком.
— То-есть он говорил? Это еще не значит быть человеком. (с) Булгаков
Re: CMake, boost и библиотеки
От: reversecode google
Дата: 21.09.23 10:56
Оценка:
а так ли вам нужен статически собранный буст?
там все равно большая часть хидер онли
я использю небольшую малость из буста
которая тянет еще больше половины буста
и при этом самих файлов которые компилиуется в объекты всего лишь с десяток

имхо проще сделать как это делают многие
папочка контриб, куда кладется распакованный буст
и дальше с смейка ссылка на нее
Re: CMake, boost и библиотеки
От: Skorodum Россия  
Дата: 26.09.23 13:42
Оценка: 6 (1)
Здравствуйте, small_cat, Вы писали:

_>Путь к boost прописан в системной BOOST_DIR, т.к. в ближайшем будущем понадобятся библиотеки с nanoseconds разрешением, библиотеки собраны в отдельную папку и указаны явно через BOOST_LIBRARYDIR.

Можно немного оптимизировать если определить BOOST_ROOT:
и установить:
cmake_policy(SET CMP0074 NEW)

In CMake 3.12 and above the find_package(<PackageName>) command now searches prefixes specified by the <PackageName>_ROOT CMake variable and the <PackageName>_ROOT environment variable.


_>Минимальный CMakeLists.txt:


_>
_>...
_>target_include_directories(hello PUBLIC ${Boost_INCLUDE_DIRS})
_>target_link_libraries(hello  ${Boost_LIBRARIES} dl)    # без dl не линкуется при использовании boost::dll
_>...
_>

target_include_directories не нужен если все правильно работает в target_link_libraries.

_>2) как корректно задать CMake, если boost собран с --layout=tagged?

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