2011-02-23 144 views
14

我想在我的項目中使用Boost的ASIO庫。它的文檔說它可以是頭 - 只有正則表達式不使用和SSL不使用。但是,運行bcpasio拿出一個很多libraies其中有些是與源等都需要編譯,bjamBoost.Asio as header-only

我可以以某種方式使用ASIO項目作爲唯一的標題,而不庫/源?我只需要ASIO,而不是Boost的其他部分。

編輯:ASIO想要Boost.System有一個lib鏈接 - 可以這種依賴不能這樣,我可以只使用頭只ASIO?

+1

Boost.Asio確實需要鏈接到Boost.System。非提升Asio不,請參閱[拉爾夫的答案](http://stackoverflow.com/questions/5089245/boost-asio-as-header-only/5089464#5089464)。 – 2011-02-23 13:19:55

回答

12

AFAIK你可以從http://think-async.com/Asio/AsioAndBoostAsio

「獲得ASIO的非升壓版本 - Boost.Asio的使用Boost.System庫提供錯誤代碼的支持(升壓::系統:: ERROR_CODE和boost :: system :: system_error),Asio在它自己的命名空間(asio :: error_code和asio :: system_error)中包含了這些類,這些類的Boost.System版本目前支持用戶定義的錯誤代碼具有更好的擴展性。

- Asio僅用於頭文件,對於大多數用途不需要鏈接任何Boost庫。Boost.Asio始終要求您鏈接到Boost.System庫,並且還要針對Boost.Thread鏈接,如果您想要o使用boost :: thread啓動線程。「

+0

我聽說過非升壓ASIO,但一些地方寫它需要仍然促進建立 – zaharpopov 2011-02-23 12:16:34

+0

@zaharpopov:根據文檔,非升壓asio不除非使用帶'boost :: regex'參數的'read_until()'或'async_read_until()'重載,否則需要Boost。 – Hasturkun 2011-02-23 13:02:25

2

我認爲bcp拉取正則表達式庫是因爲它可以被使用(並且在Windows機器上它被默認使用)。我希望你可以刪除正則表達式庫源文件沒有問題。請務必添加正確的編譯選項,如果你是編譯器在Windows (-DBOOST_DATE_TIME_NO_LIB-DBOOST_REGEX_NO_LIB

的細節是從this頁面(這由它的聲音你已經找到)。

我不知道bcp是多麼的聰明 - 我不認爲你可以通過它的上面給出的定義,防止它遵循mscv路由。

+0

看我的編輯 - ASIO也需要Boost.System這不僅是頭 – zaharpopov 2011-02-23 12:24:59

4

接受的答案是100%有效,並建議,但另一種選擇,如果你真的想/需要使用升壓支持ASIO驅動的嘗試與-DBOOST_ERROR_CODE_HEADER_ONLY編譯應用程序。使用這個宏(記錄here)應該繞過需要鏈接與Boost.System。不過,值得一讀this answer中指出的警告。特別是,你可能需要創建一個包含一個「虛擬」 CPP文件:

#define BOOST_ERROR_CODE_HEADER_ONLY 
#include <boost/system/error_code.hpp> 

該文件只禁用優化。 (就我個人而言,我不需要這樣做,但是YMMV ...)

+1

此處記錄宏:http://www.boost.org/doc/libs/1_63_0/libs/system/doc/reference.html在編譯器參數中定義(使用-D)也起作用。 – mantal 2017-02-06 13:29:44

+0

@mantal,感謝您的澄清,我編輯了我的答案,包括鏈接到Boost.System文檔。 – evadeflow 2017-02-07 16:46:29

+1

在MSVC中,我還需要-DBOOST_DATE_TIME_NO_LIB -DBOOST_REGEX_NO_LIB -DBOOST_SYSTEM_NO_LIB。雖然不需要虛擬cpp文件。 – jtbr 2017-07-10 18:40:01