2016-06-28 25 views
2

我知道.lib是靜態庫鏈接,.dll是動態的。這意味着當.exe生成時,.lib不需要在.exe中工作。但是,.dll需要放入正確的相對路徑才能引用和運行.exe。.lib和.dll在將C++代碼部署到Github期間

我的問題是.lib。將源代碼上傳到Github時,是否也將.lib文件包含在項目文件夾中?這樣做的最佳做法是什麼?

大多數演示瞭如何安裝庫,使我們的.lib文件鏈接到其原始文件夾和.dll文件移動到工作項目文件夾的教程。那麼我應該將.lib文件移動到我的項目文件夾中嗎?如果我不這樣做,這意味着下載我的源代碼的人將不得不去找對應的.lib文件來鏈接和編譯對嗎?

+2

您的問題標題是關於部署。你的問題主體是關於上傳東西給github。它是什麼?部署或源代碼管理? –

+1

「如果我不這樣做,這意味着下載我的源代碼的人將不得不去找相應的.lib文件來鏈接和編譯對不對?」如果他們正在編譯代碼,他們可以爲自己獲取庫(例如通過他們環境的包管理器),並編譯或鏈接到庫,作爲其構建過程的一部分。分發別人的圖書館不是你的責任。 –

+0

不完全如此。的確,您在運行時不需要lib,但是您可以使用.lib來描述在運行時需要的DLL。 lib可能只包含DLL的鏈接信息,而不是庫本身。 – user4581301

回答

4

我自己的「恕我直言回答」是:「GitHub上涉及源代碼。」因此,我不建議在那裏包含一個二進制文件.lib。而且,我可能也不會在那裏放置一個二進制.dll文件。

要澄清兩個文件之間的差異...

一個.lib文件是對象的代碼庫,從以前編譯產生的,那現在可以通過鏈接引用。鏈接器將選擇什麼需要,然後複製這些項目伸到不管它可能在當時建立圖書館。

.dll動態庫...在意義上是「動態的」那應用(以及其他DLL ...)可以加載其並在運行時卸載。 (Windows程序啓動器也會自動加載任何直接或間接引用的啓動DLL。)

.dll's is all or nothing。你加載它們的全部,在運行時間。相比之下,.lib的數據庫是真實的庫,僅由鏈接器使用。

=== 編輯:下一個答案,恕我直言,「釘牢它。」

+0

我的主要目的是允許下載我的代碼的用戶輕鬆地將我的項目編譯爲.exe。通過不包括.lib和.dll是否意味着我會將它們發送到尋找可用於我的代碼的兼容.lib .dll?謝謝你的回答! – Zanko

+0

*嗯...... *不是一個簡單的問題*(並且我請求其他SO參與者請在這裏請鐘意!),但是我認爲您應該將源代碼包括在內,包括所有圖書館,然後提供**非常具體的指示如何建立的事情。 ###我建議你(和我)應該等待一兩天,以便積累其他意見和答案。 「讓我們都等待*共識。」* –

+0

@MikeRobinson非常具體的說明很不錯,但不能讓一個由'autoconf'生成的全面構建腳本的蠟燭,它會檢查和配置環境所需的所有東西發現自己在。根據許可證,Zanko可能不需要 - 或者建議 - 將第三方庫的本地源包含在內。無論如何,在這種情況下,目前還不清楚爲什麼他們不提供最終的可執行文件。他們想讓事情變得簡單,對吧?爲什麼只通過提供核心作爲源,但一些圖書館編譯中途中途? (這並不排除單獨提供源代碼。) –

4

Git的回購協議是關於代碼,你不應該在你的git回購二進制文件。

然而,github上有一個名爲releases功能,它允許你上傳的二進制資產旁邊的標記釋放源。

你可以在那裏添加你的編譯庫。

+0

謝謝!在旁註中,你將如何處理參考圖像或聲音的代碼?這些二進制文件是否應該包含在內? – Zanko

+0

@贊科我相信如此。包括任何你需要使它成爲一個工作包。 – PSkocik

1

你的問題真的是關於依賴管理。無關.lib或.dll,這些只是不同種類的依賴關係。你的問題是,如果有人克隆我的存儲庫,他們如何構建它?

答案是你需要一個構建腳本,makefile文件,Rake文件,傑克文件,等等的東西,用戶可以運行做構建。例如,這可以是一個自述文件,它說:「去網站X下載你需要的文件」。或者,您可以按照您的建議在您的存儲庫中添加必要的依賴關係。在法律上,這並不總是被允許的,因爲它被認爲是「再分配」。最好的方法是使用某種依賴性管理。根據您使用的語言,有不同的依賴管理解決方案。我建議只使用公共依賴庫中的庫(.dll,.lib,.tar,。*)。

在Java中,推薦的方法是使用稱爲maven的東西。 Ruby有gem,node.js有npm包。這只不過是一個具有依賴關係列表的文件,以及一個知道如何檢索它們的工具。要構建我的庫,就像運行 npm install && node make.js那樣簡單,它說運行nodejs程序包管理器(依賴管理器)下載所有必需的文件,然後運行構建腳本。

對於C++來說,它可能類似於make install && make,它需要一個makefile來配置,說這些是在構建項目之前需要發生的事情。

個人C++的依賴管理很差,但可能會產生一些負面的反應,我只會說C/C++中的依賴管理不是我的最愛,對於大多數內部軟件或小型應用程序,我仍然會提交lib和你的代碼。如果存在包含lib文件的公共存儲庫,則在調用gcc編譯器之前,始終可以生成一個作爲構建過程的一部分的makefile/Cmake至curlwget