2016-05-23 78 views

回答

0

雖然我無法深入瞭解Universal Apps的具體內容(我不是這方面的權威),但我可以告訴你:boost::asio是一個僅包含頭文件的庫。這意味着只需將頭文件包含到您的C++項目中,該代碼將直接合併到您的主程序集中。我強烈建議以這種方式使用它。

如果你打算將這個只包含頭文件的庫包含到另一個包含在你的主應用程序中的DLL中,那麼事情就會變得混亂。首先,對於每個目標(x86,x64和ARM)構建二進制文件以及維護這些依賴關係都很頭痛,但除此之外,真正令人頭痛的是從共享程序集加載時需要做的boost::asio函數。

爲了做到這一點,您需要在代碼中定義一個名爲winsock_init::asio內的特殊靜態成員。 ::asio使用內部靜態自定義參考計數器,使用互鎖交換來跟蹤自己的使用情況。當計數器增加到零以上時,調用諸如WSAStartup()之類的東西來確保庫與Winsock很好地結合。當計數器再次達到零時,由於相同的原因再次調用WSACleanup()

結構winsock_init繞過此功能,所以它是由你來正確,手動從您的共享組件內調用這些函數,否則你會徹底打破ASIO和你的應用程序將無法對應用商店兼容性測試部署。

而且,只要你嘗試換::asio到共享的組件需要包括特殊的源文件只有一次,DLL內,然後你既需要在這個DLL項目中定義一羣特殊的升壓配置變量以及任何使用此::asio dll的項目。

我的建議再一次只是簡單地將頭文件包含在主程序集中,然後就不會引入所有這些令人頭疼的問題。另一種選擇是簡單地使用C++/CLI或Managed C++,不管它現在叫什麼,並且可以直接從混合C++代碼中訪問.NET套接字類。

See here有關將ASIO編譯爲單獨程序集的更多詳細信息,前提是您確實想要承受所描述的所有痛苦。

+0

感謝您的評論。但實際上,我的問題是更加通用的應用程序。那裏有共享組件,它擁有共享類,我不知道如何在那裏添加庫。但經過一番研究後,我發現你只需兩次添加庫。一旦進入桌面應用程序,一次進入移動設備。而共享類則直接從那裏使用它。 謝謝 –

+0

@Gabrielkotev好吧,不管你使用ASIO的應用程序類型如何,我在這裏說的所有內容都適用。考慮發佈答案以分享您的完整解決方案,並將其標記爲正確以解決此問題。 – 2016-06-02 14:20:01

相關問題