2015-01-12 42 views
2

我對C++很陌生(學習一些遊戲編程的東西),我想用公共約定來設置我的目錄結構。我沒有看到明確建議的主要混淆點是我放置依賴關係的地方。例如,我將着眼於FreeGLUT和FreeType。我已經下載的第一件事就是FreeGLUT的MSVC構建和它帶有一個子目錄結構,像這樣:關於第三方庫最常見的C++項目目錄結構約定

bin/ 
    freeglut.dll 
    x64/ 
     freeglut.dll 
include/ 
    GL/ 
     someheaders.h ... 
lib/ 
    freeglut.lib 
    x64/ 
     freeglut.lib 
readme.txt 

在我的C#開發人員希望創建一個名爲我的解決方案目錄中的「相關性」的子目錄,取所有這些,並把它放在它自己的子目錄中,然後對任何其他庫執行相同的操作,類似於NuGet軟件包目錄,然後在構建時引用適當的位置。我不是100%肯定的,但我猜測這可能是混亂的引用頭文件,如果它們分散在不同的子目錄中,因爲你不只是像在C#中那樣使用C++「添加引用」。

我的依賴應該成爲我的項目的一部分嗎?我應該將它們分解到不同的基礎文件夾中嗎?什麼是標準的事情?

n.b.據我所知,lib或dll的是一種選擇(即你不要在構建同時使用)

+1

嗯,我的問題是一個可能的重複http://stackoverflow.com/questions/3605484/where-should-i-put-third-party-libraries –

+0

錯誤的重點,考慮你如何組織你的源控制。這樣它仍然可以檢查5年,並重建完全相同的二進制文件。 C++編譯器和鏈接器不會阻止你。如果你需要靈感,請看github項目。 –

+0

圖書館經常在項目之間共享,因此它們很少適合作爲單個項目的下屬。 –

回答

2

的更多或更少的標準溶液如下:

  1. 在你的主源代碼控制庫,您只存儲編譯它們所需的源文件和編譯系統文件。根本沒有二進制依賴關係。
  2. 如果依賴關係是非常重要的獲取和安裝,則創建輔助存儲庫並將依賴項放在那裏。
  3. 如果您需要使用具有某些修改的外部庫並且上游不會接受它們,請將其完整的修改後的源代碼樹放入主源代碼管理中,並將其構建過程集成到應用程序的構建過程中(樹中fork),或者將修改的源存儲在另一個存儲庫(樹外分支)中。請注意,如果您使用樹中分叉,大多數許可證都需要您使程序成爲開源代碼。與其他人,例如LGPL,你可以發佈外樹叉的源代碼。

這是例如, Inkscape項目的確如此:在https://launchpad.net/inkscape有一個主要的存儲庫和完整的項目源代碼,並且在https://launchpad.net/inkscape-devlibs有一個單獨的存儲庫,其中包含在Windows下構建所需的依賴關係的二進制文件。

通過這種方式,您可以避免使用依賴項更改混淆修訂歷史記錄,並將大型二進制文件存儲在主樹中。