2010-12-16 65 views
2

我剛剛學習C++並開始使用不同的庫,如Boost和SDL。在第一次嘗試配置路徑之後,現在一切都看起來很好,但我仍然對爲什麼不同的庫有不同的工作有些疑問。C++庫(名稱空間,鏈接)之間的區別

  1. 爲什麼,雖然很多庫(比如升壓)在其命名空間是分開的,還有其他的(如SDL)是不是?對我而言,將所有內容保持分開更合理,因爲一個庫無法知道其他庫中使用了哪些函數。但是爲什麼SDL不是這樣?

  2. 爲什麼我必須爲幾乎每個庫手動設置鏈接器設置(.lib文件),而對於其他(如Boost)自動?是否因爲我使用了BoostPro安裝程序以某種方式使鏈接搜索自動執行?還是有其他的設置,我錯過了什麼?是否可以自動爲其他庫查找.lib文件?

回答

10
  1. SDL was written in C,而C語言本身並不支持命名空間。 Boost is a C++-only library,並充分利用了C++命名空間。

  2. Boost是一個大部分僅包含頭標的庫,因此大部分時間都沒有實際的二進制文件鏈接。當有二進制文件需要鏈接時(比如Boost.Thread),這些頭文件可能會利用特定於編譯器的指令,這些指令可以命令鏈接器鏈接到某些庫(如VC++的#pragma comment(lib, ...))。此功能在Boost環境中稱爲「自動鏈接」。否則,庫必須特別提及鏈接器。

2
  1. 技術上,SDL是一個C庫。由於C沒有名稱空間,因此SDL不使用它們。 C++(大部分)向後兼容C的事實意味着您可以在C++中使用SDL。另外,SDL使用命名空間的C「等效」:它的所有功能都以SDL開頭,有效地創建某種名稱空間。

  2. AFAIK,大多數增強「庫」不需要鏈接,因爲它們只是標題。雖然我可能是錯的。

+0

某些Boost庫不是僅包含標頭的,文檔告訴您哪個庫。根據Windows上的@In silico答案,鏈接自動化。 – 2010-12-16 16:22:21

相關問題