Здравствуйте.
Перешел на 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? В доках нигде необходимость оного не видел, обнаружил путем случайного гугления
Спасибо!
- Простите, профессор, не пса, а когда он уже был человеком.
— То-есть он говорил? Это еще не значит быть человеком. (с) Булгаков
Здравствуйте, 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.