是否可以使用mkbundle打包使用sgen GC的Mono可執行文件?使用單聲道mkbundle目標SGEN垃圾收集器
我假定因爲所產生的束需要libmono-2.0.so.1代替它使用標準GC伯姆的libmonosgen-2.0.so。我嘗試過使用$ MONO_OPTIONS = - gc = sgen,但生成的bundle仍然需要非sgen庫。
我誤解了libmono和libmonsgen庫的使用?
謝謝你的任何幫助或指導
是否可以使用mkbundle打包使用sgen GC的Mono可執行文件?使用單聲道mkbundle目標SGEN垃圾收集器
我假定因爲所產生的束需要libmono-2.0.so.1代替它使用標準GC伯姆的libmonosgen-2.0.so。我嘗試過使用$ MONO_OPTIONS = - gc = sgen,但生成的bundle仍然需要非sgen庫。
我誤解了libmono和libmonsgen庫的使用?
謝謝你的任何幫助或指導
這是一個有點棘手,因爲單聲道實際上有兩個獨立的可執行文件和兩個獨立的庫,每個垃圾收集器。例如,如果您運行mono --gc=sgen ...
那麼單聲道實際上會執行的mono-sgen ...
切換到不同的可執行文件。
同樣,mkbundle
將使用pkg-config
來選擇庫並鏈接其中一個(即無論哪個是系統默認值)。要獲取其他圖書館,有兩種選擇:
一個是重建與單是SGEN默認。顯然,這可能不是一個可行的解決方案。
替代方法是使用pkg-config
覆蓋選擇。你會創建一個副本的mono-2.pc
,用-lmonosgen-2.0
取代-lmono-2.0
,更新prefix
和exec_prefix
和使用PKG_CONFIG_PATH環境變量來挑選版本。
請注意,我從來沒有嘗試過後者,但沒有理由不應該這樣做,因爲pkg-config
是mkbundle
從中獲取庫路徑的原因。
感謝這個問題,因爲它可以幫助我確定爲什麼我的應用程序之一與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
謝謝你的答覆。您幫助我瞭解了mono-2.pc是指定要創建可執行文件的鏈接文件。有趣的是,已經有一個位於lib/pkgconfig目錄中的monosgen-2.pc文件。這使我認爲必須有一種方法來使用命令行開關或環境變量來覆蓋mono-2.pc的使用。我試着改變PKG_CONFIG_PATH來實際包含文件,但它不成功。 – drg
如果你看看'mkbundle.cs'源代碼,你會發現'mono-2.pc'是不幸的。但是,現在測試之後,它對我來說很有效,因爲我測試的程序與libmonosgen-2.0.0.dylib(在Mac上,使用Mono 3.0.10)鏈接併成功運行。請注意,'PKG_CONFIG_PATH'必須指向包含文件的目錄,而不是文件本身。 –
在你的上面的答案中,你說「一個是用sgen作爲默認進行重建」......這是否意味着重建單聲道本身或重建應用程序。我猜你的意思是重建單聲道本身,因爲我似乎無法找到任何有關如何將其指定給mcs的信息。感謝您在查看代碼方面的洞察力。可悲的是,來自沉重的MS和Visual Studio背景...甚至沒有發生過我。它應該有:)。 – drg