Вопрос:
Я хочу статический link boost.asio для моего небольшого проекта без внешних библиотек (имея только один файл exe/bin в результате для его распространения). Boost.asio требует Boost.system, и я начинаю тонуть, пытаясь понять, как скомпилировать все это. Как использовать Boost.asio с cmake?
Лучший ответ:
Если я понимаю фактический вопрос, он в корне задает вопрос о том, как статически ссылаться на сторонние библиотеки в CMake.
В моей среде я установил Boost для /opt/boost.
Самый простой способ – использовать FindBoost.cmake в установке CMake:
set(BOOST_ROOT /opt/boost) set(Boost_USE_STATIC_LIBS ON) find_package(Boost COMPONENTS system) include_directories(${Boost_INCLUDE_DIR}) add_executable(example example.cpp) target_link_libraries(example ${Boost_LIBRARIES})
Вариант, который находит все библиотеки Boost и явно связывается с системной библиотекой:
set(BOOST_ROOT /opt/boost) set(Boost_USE_STATIC_LIBS ON) find_package(Boost REQUIRED) include_directories(${Boost_INCLUDE_DIR}) add_executable(example example.cpp) target_link_libraries(example ${Boost_SYSTEM_LIBRARY})
Если у вас нет надлежащей установки Boost, есть два подхода к статической привязке к библиотекам. Первый подход создает импортированную цель CMake:
add_library(boost_system STATIC IMPORTED) set_property(TARGET boost_system PROPERTY IMPORTED_LOCATION /opt/boost/lib/libboost_system.a ) include_directories(/opt/boost/include) add_executable(example example.cpp) target_link_libraries(example boost_system)
И альтернатива заключается в том, чтобы явно перечислить библиотеку в target_link_libraries а не в целевой:
include_directories(/opt/boost/include) add_executable(example example.cpp) target_link_libraries(example /opt/boost/lib/libboost_system.a)