2013-06-28 97 views
1

是否可以使用mkbundle打包使用sgen GC的Mono可執行文件?使用單聲道mkbundle目標SGEN垃圾收集器

我假定因爲所產生的束需要libmono-2.0.so.1代替它使用標準GC伯姆的libmonosgen-2.0.so。我嘗試過使用$ MONO_OPTIONS = - gc = sgen,但生成的bundle仍然需要非sgen庫。

我誤解了libmono和libmonsgen庫的使用?

謝謝你的任何幫助或指導

回答

1

這是一個有點棘手,因爲單聲道實際上有兩個獨立的可執行文件和兩個獨立的庫,每個垃圾收集器。例如,如果您運行mono --gc=sgen ...那麼單聲道實際上會執行的mono-sgen ...切換到不同的可執行文件。

同樣,mkbundle將使用pkg-config來選擇庫並鏈接其中一個(即無論哪個是系統默認值)。要獲取其他圖書館,有兩種選擇:

一個是重建與單是SGEN默認。顯然,這可能不是一個可行的解決方案。

替代方法是使用pkg-config覆蓋選擇。你會創建一個副本的mono-2.pc,用-lmonosgen-2.0取代-lmono-2.0,更新prefixexec_prefix和使用PKG_CONFIG_PATH環境變量來挑選版本。

請注意,我從來沒有嘗試過後者,但沒有理由不應該這樣做,因爲pkg-configmkbundle從中獲取庫路徑的原因。

+0

謝謝你的答覆。您幫助我瞭解了mono-2.pc是指定要創建可執行文件的鏈接文件。有趣的是,已經有一個位於lib/pkgconfig目錄中的monosgen-2.pc文件。這使我認爲必須有一種方法來使用命令行開關或環境變量來覆蓋mono-2.pc的使用。我試着改變PKG_CONFIG_PATH來實際包含文件,但它不成功。 – drg

+0

如果你看看'mkbundle.cs'源代碼,你會發現'mono-2.pc'是不幸的。但是,現在測試之後,它對我來說很有效,因爲我測試的程序與libmonosgen-2.0.0.dylib(在Mac上,使用Mono 3.0.10)鏈接併成功運行。請注意,'PKG_CONFIG_PATH'必須指向包含文件的目錄,而不是文件本身。 –

+0

在你的上面的答案中,你說「一個是用sgen作爲默認進行重建」......這是否意味着重建單聲道本身或重建應用程序。我猜你的意思是重建單聲道本身,因爲我似乎無法找到任何有關如何將其指定給mcs的信息。感謝您在查看代碼方面的洞察力。可悲的是,來自沉重的MS和Visual Studio背景...甚至沒有發生過我。它應該有:)。 – drg

0

感謝這個問題,因爲它可以幫助我確定爲什麼我的應用程序之一與mkbundle捆綁後運行太慢。這是因爲使用了Boehm GC發動機。

要包含SGen,您只需使用--keeptemp標誌調用mkbundle,然後重新編譯命令(由mkbundle打印)以包含monosgen-2而不是mono-2。

例子:(適用於Mac,但是可以很容易地改寫爲Linux)

export PATH=/Library/Frameworks/Mono.framework/Commands/:$PATH 
export AS="as -arch i386" 
export CC="cc -arch i386 -framework CoreFoundation -lobjc -liconv" 

mkbundle TestApp.exe --deps --static -o TestAppBundleName --keeptemp 

cc -arch i386 -framework CoreFoundation -lobjc -liconv -o TestAppBundleName -Wall `pkg-config --cflags monosgen-2` temp.c `pkg-config --libs-only-L monosgen-2` `pkg-config --variable=libdir monosgen-2`/libmonosgen-2.0.a `pkg-config --libs-only-l monosgen-2 | sed -e "s/\-lmonosgen-2.0 //"` temp.o