2013-03-08 39 views
2

我想靜態鏈接boost.asio到我的小項目沒有外部庫(只有單個exe/bin文件結果分發)。 Boost.asio需要Boost.system,我開始淹死試圖弄清楚如何編譯這一切。 如何使用cmake使用Boost.asio?與cmake一起使用Boost.asio?

+0

所有升壓組件可以靜態鏈接。你又有什麼問題? – 2013-03-08 09:34:54

+0

我已經搜索了很多次,每次我發現一些問題,爲什麼我不能編譯它。所以我提出了問題如何做到這一點。我不能用cmake編譯boost的任何部分,也不知道如何用cmake靜態地在我的項目中使用它。 – Fedcomp 2013-03-08 12:04:32

+2

查看'FindBoost.cmake'的內容。你可以在CMake安裝的'Modules /'目錄中找到它。 – arrowd 2013-03-08 17:25:10

回答

7

如果我理解實際的問題,它基本上要求如何靜態鏈接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)