2017-02-04 17 views
-1

因此,我爲基於二叉樹的數據結構(如AVL,紅黑色,嘗試等等)創建了一些C++頭文件,並且我想創建一個.lib文件,我可以隨時在更大的項目上使用該文件。我寫的代碼都是面向對象的,並且是模板化的。事情是,我擁有的是很多頭文件(我在頭文件中包含了函數,因爲我使用了模板,並且我想要最大的模塊性)並且沒有源文件。我試圖在Visual C++中創建一個新的.lib項目,但它不會生成沒有源文件的任何.lib文件,如果沒有我不願意做出的妥協,我無法創建它。我沒有看到這個問題的任何解決方案,所以我可以請我就如何繼續進行一些輸入?謝謝!靜態和動態圖書館創作:如何?

回答

2

如果您已經創建了一個源代碼完全由C++頭文件 組成的庫,那麼我們稱之爲標頭庫。沒有什麼你需要做的。

Header-only C++庫是正常的。許多Boost libraries 是僅標題。標準C++庫的子集傳統上被認爲是 ,因爲Standard Template Library傳統上只有標題。當庫接口完全由模板組成 時,實現很可能是在您有 寫入頭文件時完成的,並且在這種情況下,頭文件庫。

你希望你的模板庫可以在其他項目中重用嗎?它已經是 了。爲了重複使用它: -

  • 你告訴你的編譯器在哪裏使用其 包括的目錄選項,或在你的IDE

  • #include頭文件中的相應項目設置,找到頭文件(根據需要)。

這就是它的全部。

切割您在MS Visual Studio中的牙齒可以給你一個早期的印象 一個庫必須有一個文件.lib沒有一個明確的想法,爲什麼應該是這樣的。 在MS Windows環境中,當庫是傳統庫 時,這是真的 - 不是C++僅包含頭標的庫。 (在Linux 和其他操作系統中,相應的事情都是如此,除了它們有別的東西而不是.lib文件)。 傳統的C或C++庫是由頭文件構建的,這些頭文件定義了它的接口,以及定義其實現的單獨源文件 。構建庫需要將每個源文件編譯成包含庫實現的一部分的對象文件,然後將所有這些對象文件以某種形式 - 動態的 庫或靜態庫 - 打包到整個實現。

因此,要重用傳統庫,我需要它的頭文件,這樣我就可以在我的源代碼中正確調用它的接口;並且我需要包含其二進制實現的目標文件庫包 ,以便I 可以告訴鏈接程序將我的目標文件與該包 一起鏈接,並生成完整的工作程序。該庫的.lib文件代表 目標文件包到鏈接器(儘管代表對於靜態庫意味着一件事 ,而對於DLL而言則是非常不同的東西)。

對於僅標頭庫,根據定義存在限定的執行部件沒有單獨的源 文件。因此沒有單獨的對象文件。 因此沒有單獨的對象文件包。沒有.lib。沒有聯繫。沒有什麼要 被鏈接。


[1],其提供專門 模板接口的文庫很可能是 實施 專門用模板,包括不過其接口的 模板實現方式中,在其首部的文件。但沒有什麼 從編寫執行 與非模板代碼的內部零件停止執行者,如果他們看到這樣做有一些決定性的優勢 - 規模優化, 吧?在這種情況下,即使接口 都是模板,它們也不會收到只有標題的庫。在沒有反補貼的考慮,自然 執行模板接口是一個模板實現和 一個只有標題 - 庫是純天然產品。

+0

感謝您花時間寫出如此深刻的深入指導。真的幫助了我! – ijustpostedsomethingdumb