2011-09-08 80 views
4

我想爲我的程序的用戶提供一些Linux二進制文件以及當前的Windows二進制文件,所以我安裝了Ubuntu 11.10(自haskell-platform在11.04包仍然是2010版)。但是,當我嘗試在Ubuntu 10.04上運行所得到的二進制文件時,我收到消息說找不到libgmp.so.10。檢查/ usr/lib顯示10.04附帶libgmp.so.3,而11.10附帶libgmp.so.10。因此,看起來GHC是動態鏈接到libgmp而不是靜態的,我認爲它是默認的。構建在Ubuntu 11.10上的Haskell程序不能在Ubuntu 10.04上運行

有什麼辦法可以告訴GHC在二進制文件中靜態包含libgmp嗎?如果沒有,是否有其他解決方案不需要用戶安裝不同版本的libgmp?

+0

除非我錯了,'libgmp'默認是動態鏈接的原因是,靜態鏈接它會迫使您在GPL許可證下分發生成的可執行文件。 – hammar

+0

你最好編寫一個軟件包,讓每個軟件包爲每個不同的拱形構建,而不是靜態鏈接gmp – alternative

回答

2

事實證明,爲了靜態鏈接二進制,靜態標誌是不夠的。相反,使用:

ghc -static -optl-static -optl-pthread --make yourfile.hs 

使用這個,我的二進制文件在兩個版本的Ubuntu上都能正確運行。

+0

我正在嘗試將我的Web應用程序部署到Heroku Cedar堆棧。 Cedar使用Ubuntu 11.04,我使用11.10。所以,基本上我得到了同樣的錯誤。但是我嘗試了你的解決方案,它引發了一個新的錯誤,'mkTextEncoding:無效參數(無效參數)'。你能幫我一下嗎? –

1

通常,舊的libgmp包也可以使用;也就是說,使程序依賴於libgmp3c2包而不是通用的libgmp或libgmp10。這通常可以通過編譯GHC的早期版本或gmp庫來實現(例如,安裝libgmp3-dev而不是libgmp10-dev)。

+0

但是它不會動態鏈接到libgmp3,這意味着它不會在Ubuntu 11.10和其他Linux發行版上運行?你也提到通用的libgmp。有沒有辦法讓二進制使用它遇到的任何版本的libgmp? – FalconNL

+0

與通用libgmp我的意思是通用包,它會自動提供當前版本的libgmp。你不能一般地鏈接你的程序,因爲新的主要版本號意味着在從libgmp3轉換到libgmp10的過程中功能已經下降。你的程序也可以在Ubuntu 11.10上運行,因爲Ubuntu 11.10仍然有libgmp3可用(可以並行安裝多個主版本)。總結:如果-static對你來說是一個足夠的選擇,那沒關係,如果你使用-dynamic,則使用最古老的合理庫。 – thiton

+0

只需確保您的.deb表示依賴於其控制文件中動態庫的所需版本。 – tripleee

1

你有ghc選項-static靜態鏈接庫。

+0

嗯,在Linux上你需要明確地啓用它嗎?我一直認爲GHC默認靜態編譯。當我回家時我會試試這個。 – FalconNL

+0

好吧,我試着用-static編譯,不幸的是我仍然得到相同的錯誤信息。任何想法我做錯了什麼? – FalconNL