2011-01-19 83 views
18

在MS Visual C++ 2010如何鏈接升壓在一個獨立的靜態庫

我有一個單獨的C++項目在我的解決方案中使用boost和完美工作。

然後我決定將這個項目轉換成一個靜態庫並且創建一個依賴於這個靜態庫的新項目。

現在,我的轉換後的靜態庫生成沒有錯誤和警告(編譯器和鏈接器) 但新項目編譯但不鏈接。

我越來越:

1>LINK : fatal error LNK1104: cannot open file 'libboost_thread-vc100-mt-1_45.lib' 

作爲測試我加入了完整的目錄路徑此庫的連接選項...,然後抱怨

1>LINK : fatal error LNK1104: cannot open file 'libboost_date_time-vc100-mt-1_45.lib' 

我現在已經添加所有庫的完整路徑,現在可以構建並運行。

我不滿意這個解決方案,因爲:

  1. 我不希望庫的用戶 擔心在 提升鏈接。
  2. 這是凌亂

我知道一個答案是創建一個DLL,但有沒有辦法靜態做到這一點,並保持連接我的靜態庫的水平。

編輯:

如果我告訴.exe文件鏈接器忽略升壓庫明確則一切正常,除了.exe文件不應該擔心升壓可言。

/NODEFAULTLIB:"libboost_thread-vc100-mt-1_45.lib" /NODEFAULTLIB:"libboost_date_time-vc100-mt-1_45.lib" 

回答

24

顯然你不需要.libs,因爲你的exe也沒有鏈接。您似乎在使用僅提升頭文件的方法和類。因此,只需告訴boost以通過在項目中定義預處理器符號BOOST_ALL_NO_LIB來禁用自動鏈接。

如果你想使你的.lib不必要的大的,包括所有的提振,這個問題似乎舉行一個答案(我從來沒有真正嘗試過我自己):Linking static libraries to other static libraries

4

在構建庫時,可以在你的庫中包含boost庫。爲此,在VisualStudio的Librarian > General屬性頁面中,列出您的增強庫爲Additional Dependencies

但是,如果您的客戶自己使用boost,並且靜態鏈接到它(尤其是與您正在使用的版本不同的版本),那麼可能存在問題。

+0

是的,我看到了這個選項,但是不能讓它工作。我將鏈接器輸出增加爲冗長,我發現.lib項目鏈接到boost .obj文件和.exe搜索,並找到boost庫,然後嘗試鏈接到它們。 – T33C 2011-01-19 15:46:23

+0

您可以發佈詳細構建輸出(構建庫時)? boost庫應該在你的lib命令行上。如http://msdn.microsoft.com/en-us/library/e17b885t(v=VS.100).aspx所述,`LIB創建一個包含指定文件中所有對象的庫。因此,當您的.exe鏈接到您的庫時,它不應該需要boost(除非在庫的公共頭文件中包含boost)。 – 2011-01-19 15:55:49

+1

+1感謝Daniel,問題似乎與BOOST自動鏈接庫中的方式有​​關。它們被視爲defaultlib,並隨着運行時一起被傳播。定義BOOST_ALL_NO_LIB並鏈接到我的.lib中的boost庫中。 – T33C 2011-01-20 10:37:51

1

您是否建立了提升庫? Boost中的某些庫需要編譯。如果您還沒有這樣做,請參閱「Getting started in Windows」,瞭解如何構建Boost庫。

EDIT-1: Boost可以構建爲靜態和動態可加載(dll)庫。

EDIT-2:如果你已經構建了Boost,那麼@Daniel Gehriger的答案告訴你如何將它添加到VS中。