我想将boost.asio静态链接到我的小项目中,不使用外部库(只有一个单独的exe/bin文件来分发)。Boost.asio需要Boost.system,并且我开始陷入困境,尝试弄清楚如何编译所有这些内容。如何在cmake中使用Boost.asio?
如果我正确理解问题,它基本上是在询问如何在CMake中使用静态链接第三方库。
在我的环境中,我已经将Boost安装到/opt/boost
目录下。
最简单的方法是使用CMake安装提供的FindBoost.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)
FindBoost.cmake
的内容。您可以在CMake安装的Modules/
目录中找到它。 - arrowd