2016-12-21 49 views
1

這似乎有點荒謬的要求,但我正在努力尋找一個好的系統。是否有用於存儲和組織第三方開發庫的標準化系統?我受到強迫症的困擾,認爲自己是一個「整潔的怪胎」,所以我傾向於使用大量的目錄/子目錄來組織項目,但由於我是一個新開發者,我最近開始涉足第三方庫我不知道如何去組織它們。我會使用大量的文件夾並創建一個龐大的層次結構,但這樣做可能會導致我的源代碼的#includes中出現一些極長的絕對路徑。有什麼建議麼?哪裏應該放置第三方圖書館?

+3

不要使用絕對路徑,將包含目錄傳遞給編譯器。通常'#include '是導入第三方庫標題的標準方式。 – jtbandes

+0

@jtbandes我想我不知道如何爲第三方庫做這件事。我使用IDE附帶的標準庫(如'#include ')執行此操作,但不知道如何爲外部下載的庫執行此操作,這需要我將它們放在某處。 –

+0

儘管它對於stackoverflow來說有點寬泛,但在開始編寫代碼時,它實際上是一個非常有趣的問題,尤其是考慮到版本控制和源代碼控制(git)時。某些語言對支持的庫有更多的功能(python pip virtualenv)。 – stefaanv

回答

0

只要確保編譯器和編譯後的程序都能找到他們需要的文件,第三方庫就可以到達任何地方。所以你可以隨意組織你的文件,只要你確保你告訴編譯器和編譯的程序。

具體如何做到這一點取決於您正在使用的IDE(集成開發環境)。我使用visual studio,所以如果你使用別的東西,確切的術語可能會有所不同。在visual studio中,你必須去你的項目的屬性來做到這一點。

對於外部庫的頭文件,請轉到配置屬性> C/C++>常規,然後單擊「其他包含目錄」。如果編輯該字段的值,則可以將路徑添加到外部庫的include目錄中,該目錄應包含外部庫的所有頭文件。通過使用Visual Studio提供的宏,您可以使這些路徑相對,這樣,無論何時移動項目,您都不必這樣做。確保你不刪除「%(AdditionalIncludeDirectories)」。還要確保窗口頂部的選定配置和平臺與您要編譯的配置和平臺相匹配。使用宏可以同時爲所有配置和平臺設置,這有點困難,但是從長遠來看,這會節省您的時間。從我的一個項目爲例:

$(SolutionDir)dependencies\SDL2_image-2.0.1\include;$(SolutionDir)dependencies\SDL2-2.0.5\include;%(AdditionalIncludeDirectories) 

對於庫文件,你需要去配置屬性>鏈接>常規,然後點擊「附加庫目錄」。編輯此值以將路徑添加到外部庫的lib文件夾。你可以在這裏再次使用宏。

$(SolutionDir)dependencies\SDL2-2.0.5\lib\x64;$(SolutionDir)dependencies\SDL2_image-2.0.1\lib\x64;%(AdditionalLibraryDirectories) 

接下來,進入配置屬性>鏈接>輸入和編輯「附加依賴」添加你需要的.lib文件的名稱。這次只是文件名,你不需要這裏的路徑。來自我的一個項目的示例:

SDL2main.lib;SDL2.lib;SDL2_image.lib;%(AdditionalDependencies) 

最後,您需要確保編譯的程序能夠找到外部庫的.dll文件。爲此,您可以使用像PATH等系統變量,但我不建議這樣做。我更喜歡使用構建後事件。像這樣的事件基本上是一系列命令行命令,這些命令在編譯完程序後執行。您可以通過轉到配置屬性>構建事件>構建後事件並編輯「命令行」來添加此事件。你可以放什麼在這裏,從我的一個項目爲例,如下圖所示:

copy /Y "$(SolutionDir)dependencies\SDL2_image-2.0.1\lib\$(PlatformTarget)\*.dll" "$(TargetDir)*.dll" 
copy /Y "$(SolutionDir)dependencies\SDL2-2.0.5\lib\$(PlatformTarget)\SDL2.dll" "$(TargetDir)SDL2.dll" 
xcopy /Y /S /E /I "$(SolutionDir)assets" "$(TargetDir)assets" 

注意,我再次使用宏:$(SolutionDir),$(PlatformTarget),$(TARGETDIR)被替換解決方案目錄,平臺目標和目標目錄分別爲Configuration和Platform的每個組合。

+0

非常感謝您的超級詳細報告。我會盡我所能去弄清楚如何用Xcode來做到這一點。 –

0

你有2種選擇:

  1. 使用系統安裝的庫(和頭文件),告訴編譯器在哪裏可以找到他們。
  2. 使用的文件夾中的項目(使用文件夾./external存儲外部來源,如./external/boost-asio用於升壓ASIO庫),下載源初始化項目的時候(我更喜歡使用git submodules下載外部來源),並與你的項目構建它們。

CMAKE是一個構建工具,它可以幫助您實現這兩個。

無論哪種方式,由於jtbandes寫道,不要使用絕對路徑。