2009-12-30 68 views
16

比方說,我有我的cygwin下編譯的應用程序,我想分發應用程序,而無需用戶安裝cygwin。打包可執行文件和cygwin DLL足夠了嗎?運行的應用程序,在Cygwin中編譯,而無需安裝了cygwin

+3

Cygwin的DLL是GPL的,所以你也必須分發您的應用程序的來源。 – 2009-12-30 16:29:37

+0

但您可以購買Cygwin的商業許可證。 – 2009-12-30 18:27:08

+0

請詳細說明 - 因爲答案中似乎有兩種解釋。你的意思是技術上(我需要分發哪些*其他*文件),或者合法(許可證允許我做什麼)? – Wim 2010-01-06 12:20:38

回答

2

通常,是的。雖然(Windows \ System32)確保將Cygwin DLL安裝在公共位置,但是當它的多個版本加載到同一臺機器上時,此DLL的行爲非常糟糕。

+1

[GPL鏈接和衍生作品(http://en.wikipedia.org/wiki/GNU_General_Public_License#Linking_and_derived_works) – 2009-12-30 16:36:03

+1

問題未說明關於作者不釋放任何代碼。許多實用程序會捆綁cygwin1.dll。一個這樣的例子是cntml:http://cntlm.sourceforge.net/。 – brianegge 2010-01-06 02:57:41

0

你可以嘗試編譯所有靜態。這應該允許你運行一切,而不需要libs(因爲它們已經在你的二進制文件中)。 但是,這也意味着它可能無法正常工作的所有平臺上的cygwin是否需要不同的或較新的DLL。

+0

這將無法正常工作:http://stackoverflow.com/questions/340696/can-you-statically-compile-a-cygwin-application – Hut8 2013-07-24 15:20:36

3

您的應用程序是否真的需要任何Cygwin提供的Posix仿真程序?如果沒有,你可以使用-mno-cygwin標誌編譯它,它不會依賴於cygwin,而是一個本地Windows應用程序。通常,您只需要一個真正的shell(bash)來配置和構建應用程序,但實際上並不需要Cygwin的Posix功能。

另一種替代方案是MSYS + MinGW,它是Cygwin的輕量級叉子。這提供了一個默認生成本地Windows應用程序的編譯環境。

第三個選擇是從自身的Cygwin使用MinGW的編譯器。它們應該可以通過普通的Cygwin軟件包管理器來使用。然後,您將使用MinGW編譯器配置項目進行交叉編譯。

+0

MSYS不是cygwin的分支。 – 2009-12-30 18:08:42

+1

http://www.mingw.org/history http://en.wikipedia.org/wiki/MinGW#Comparison_with_Cygwin 另外,MinGW郵件列表上的主要人員經常說MinGW/MSYS是一個叉cygwin的。 – 2009-12-30 18:24:23

+0

MinGW不是MSYS – 2009-12-30 18:28:51

2

事情已經改變了。在Cygwin庫目前正在較寬鬆GPL(V3),這使得它能夠以落在下範圍廣泛的許可證,從FOSS到專有應用捆紮在一起。

什麼阻礙的方式是,在Cygwin中的POSIX模擬從本地Windows應用程序的角度看需要的東西有點過分。

這是我Cygnal項目進來Cygnal公司代表Cygwin的原生應用程序庫:這是一個簡易的Cygwin兼容叉而改變,或在某些情況下,只需重新可以配置,某些功能的行爲,以以符合Windows平臺的本地慣例。

一個基本的「Hello,World」Cygwin程序需要兩個庫。一個GCC運行時稱爲cyggcc_s-1.dll和Cygwin的DLL cygwin1.dll。 Cygnal項目爲後者提供了替代品。 (32位版本可供下載)。世界Cygwin的POSIX視圖和Windows之間的不兼容的

一個明顯的區域是路徑處理。文件系統的Cygwin的視圖是通過假/根目錄,它提供等/cygdrive/proc/dev空格其自身的內部「裝載表」。 Cygnal放棄了這一切。路徑是Win32路徑。當前工作目錄的行爲與Windows當前工作目錄類似。驅動器與當前目錄相關聯,驅動器相對路徑如D:foo.txt在Cygnal下工作。在Cygnal下,/dev/proc仍可用:它們作爲特殊前綴dev:/proc:/進行訪問。這是不允許chdir這些:這不會是本地的!在Cygnal下,如果chdirD:\wherever那麼您當前的驅動器是D驅動器,而路徑/foo\foo指的是D:\foo。Cygwin的主要POSIX根目錄不見了。

然而,使用Cygnal,您可以繼續使用POSIX功能,從而可以開發跨平臺程序,這些程序只需較少的代碼即可基於平臺進行切換,而使用MinGW或Microsoft Visual C/C++。

例如:你可以寫使用VT100代碼和termios一個Win32控制檯應用程序。相同的代碼將在Unix上運行。無需在Windows上使用Win32控制檯API,在POSIX系統上使用VT100/termios

又如:穿線,你可以只使用POSIX線程。 pthread_create啓動線程,pthread_mutex_lock來鎖定互斥鎖等。對於轉換爲Win32或POSIX的線程,您的程序不需要可移植性抽象;你只需要使用POSIX就是這樣。

Cygnal中的uname函數報告sysname帶有CYGNAL前綴而不是CYGWIN。通過這種方式,您的程序可以知道它在Cygnal上運行,而不是在Cygwin(或任何其他POSIX平臺)上運行。因此,您可以進行必要的調整:例如,如果您的程序需要/dev/null,則可以使用Cygnal代替dev:/null