2010-04-10 127 views
0

對於我的學士論文,我正在實現一個分解版本的算法來分解大整數(找到主因式分解)。這在例如RSA密碼系統的安全性。我的願景是,客戶端(Linux或Windows)將下載應用程序並計算一些數字(這些數字是獨立的,因此適合並行化)。這些數字(經常沒有找到)將被髮送到主服務器,以收集這些數字。一旦主服務器收集到足夠的數字,它就會完成其餘的計算,這不容易並行化。Boost :: Asio for C++的問題

無論如何,以技術。我正在考慮使用Boost :: Asio來執行套接字客戶端/服務器實現,以便客戶端與主服務器進行通信。由於我想爲linux和windows編譯,所以我認爲windows將是最好的開始。於是我下載了Boost庫和編譯它,因爲它在Boost Getting Started page說:

bootstrap

.\bjam

這一切都編譯就好了。然後我嘗試編譯一個來自Asio的教程示例client.cpp,發現(這裏..編輯:由於限制,不能發佈鏈接)。我使用Visual C++編譯器從Microsoft Visual Studio 2008中,像這樣:

cl /EHsc /I D:\Downloads\boost_1_42_0 client.cpp

但我得到這個錯誤:

/out:client.exe

client.obj

LINK : fatal error LNK1104: cannot open file 'libboost_system-vc90-mt-s-1_42.lib'

任何人有任何想法可能是錯誤的,或者我怎麼可以移動前鋒?我一整週都在努力,爲C++工作獲得一個簡單的客戶/服務器套接字程序,但沒有運氣。嚴重的挫折踢英寸

謝謝你提前。

回答

2

構建失敗的原因是因爲它無法找到包含boost系統的庫文件。 Boost包含一個「方便」的自動鏈接功能,這樣當你爲二進制libaray包含頭文件(而不是頭文件庫)時,boost會自動告訴編譯器它應該鏈接到庫中。這樣做的缺點是boost不會告訴編譯器在哪裏找到庫。

簡短的回答是在提升入門指南中進一步閱讀。此頁面顯示如何將必要的標誌添加到編譯器命令行:Getting started on windows: linking from the command line

您需要做的第一件事是找到.lib文件。 Boost將它們隱藏在一個深層的目錄結構中,因此從您運行bjam的目錄開始搜索它。記下文件所在的目錄。您也可能希望使用bootstrap --prefix=/some/install/locationbjam install來安裝boost,而不是其中構建它的源目錄。

您是使用Visual Studio解決方案還是在命令行構建項目?

如果您使用的是解決方案文件,請在解決方案屬性中找到鏈接頁面。應該有一個框,您可以在其中輸入其他庫路徑。將用於增強.lib文件的目錄添加到此框中。

如果您在命令鏈接上使用cl,請熟悉cllink的命令行選項。您可以使用cl選項/link將命令傳遞給鏈接器,並且您正在查找的鏈接器命令是/libpath

+0

你好,謝謝你的回答。 做加速的全新編譯後,我發現有名字很相似,我需要的,例如一些.lib文件: libboost_system-VC90-mt.lib libboost_system-VC90-MT-1_42.lib libboost_system -vc90-mt-gd.lib libboost_system-vc90-mt-gd-1_42.lib 但是沒有與它正在抱怨的確切名稱無關,它是 libboost_system-vc90-mt-s-1_42.lib。所以我不確定該從哪裏出發? -s是否意味着它是一個靜態庫,如果是這樣,我該如何告訴Boost我想要這樣編譯? 我正在編譯一切從命令提示符。 – 2010-04-10 17:49:14

+0

-s表示它正在查找靜態鏈接到C++標準庫和運行庫的庫。要構建這個庫,請嘗試'bjam link = static link = shared runtime-link = static runtime-link = shared',這應該構建所有可能的組合。 – mch 2010-04-10 21:03:38

+0

感謝mch, 我通過做一個新的解壓縮boost,並做booststrap,其次是bjam link = static runtime-link = static。然後我添加了庫路徑(/ stage/lib /)作爲cl的標誌。 謝謝! – 2010-04-11 16:23:52