2012-06-08 172 views
6

我不知道如何「包裝」 C++的發佈項目。它採用各種庫,我不希望用戶不得不通過相同的設置我所做的,與把正確的文件在正確的地方和這樣的。我很難研究這個問題,因爲我不確定這個問題的技術術語。如果我在Linux上使用命令行編譯,有沒有簡單的方法來做到這一點?如何打包C++與DLL和庫

+0

正在編譯Linux上的dll? – Attila

+0

對不起,我很愚蠢,我現在正在Linux和Windows上開發,而且我必須爲我的兩個庫進行大量設置。我是一個新手,可能會混合兩個。我必須鏈接到圖書館,我在Windows上使用dll(至少我認爲那是發生在那裏)。我正在編輯這個問題只是說圖書館,因爲我不知道事物之間的正確技術區別。 – akroy

+1

庫有兩個版本:靜態和動態。靜態庫直接與可執行文件鏈接,因此您不必擔心將它們放在任何位置(代碼是可執行文件的一部分)。使用動態庫時,您需要確保運行時可以找到它們:您需要將它們放在一個公共路徑中,或者爲庫設置搜索路徑以包含它們所在的目錄。請閱讀[兩個]( http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html)[文章](http://www.eyrie.org/~eagle/notes/rpath.html)瞭解更多信息。 – Attila

回答

4

您對這種做法將在Windows和Linux不同,因爲每個操作系統處理這個問題的方式不同。我更熟悉Linux,因此我將答案限制在Linux的一面。

當使用-l標誌鏈接器默認與庫鏈接可執行看在正常系統庫的目錄,所以這裏有四種方法。

  1. 要求用戶自己正確安裝庫。但是,這聽起來像你不想這樣做。

  2. 讓用戶添加庫位置LD_LIBRARY_PATH變量。

  3. 你的第三個選擇是強制鏈接中使用-rpath標誌庫一定的路徑看。例如,爲了讓應用程序在其工作目錄中查找共享庫,您可以使用以下代碼進行編譯:g++ -rpath ./ -l SomeLib -o MyApp myapp.cpp

  4. 另一個選項是將您的代碼與其庫進行靜態鏈接,這樣您只需分發一個可執行文件。如果靜態庫中存在,您可以使用g++ -static -l SomeLib -o MyApp myapp.cpp告訴GCC靜態鏈接。

+0

爲什麼不將它們全部靜態鏈接? – vidit

+0

@vidit我想包括靜態鏈接將是一個好主意。我編輯我的帖子。謝謝你提醒我。 –

+0

靜態鏈接並不總是有效的,例如當您使用GPL庫時,但不想根據GPL許可您的程序。 – Cubic

1

你的意思是一個安裝程序?
在Windows您運行安裝新的應用程序,它出局一切都在正確的目錄,創建開始菜單,讓你的程序未安裝?

有在Visual Studio安裝程序生成器(可能不是在免費版本),這使得.msi安裝文件。使用簡單的任務相當容易,但要做更多的事情會變得複雜。

或者,創建傳統的setup.exe類型安裝我用的是優秀的免費Innosetup

在Linux上,你會使用一般創建一個包的任何格式分發用途(.deb文件/的.rpm)。有很多在每一個細節和工具的說明這樣做將可能已經被安裝在你的Linux系統

2

在Windows上我會威克斯推薦給http://wix.sourceforge.net/創建.msi安裝 我想指出的是,爲的.dll我將推薦所有.dll文件在同一文件夾中,因爲這是你的.exe文件的查找路徑具有最高優先級

但VC CRT(在C/C++運行時庫)應使用再分配包從微軟安裝 - >自動更新http://www.microsoft.com/de-de/download/details.aspx?id=5555

維克斯可包括再分配包入同一的.msi因此您只需部署一個安裝程序文件。