2012-05-23 145 views
1

我想在Windows上將libmono編譯爲靜態庫。將mono編譯爲靜態庫

目標平臺是Windows x86。構建環境:Windows 7 64位,VC++ Express 2010

我已經做了什麼。

1)已下載單聲道2.10.8聲源。
2)從msvc文件夾打開mono.sln,並確保一切都在compilling。
3)然後我做了一些改變:
3.1)常規 - >項目Defaults->配置類型:靜態庫(.LIB)
3.2)常規 - >項目Defaults-> MFC的使用:使用標準Windows庫
3.3)C/C++ - >代碼發生 - >運行時庫:多線程(/ MT)
4)內置它和VC++ 2010成功創建單2.0.lib
5)添加在它的連接器的輸入我自己的項目(我想嵌入單聲道):
5.1)常規 - >項目默認值 - >配置類型:應用程序(.exe)
5.2)常規 - >項目默認值 - >使用MFC:使用M FC在Ststic圖書館
5.3)C/C++ - >代碼發生 - >運行時庫:多線程(/ MT)

看來近乎完美的,但有一些可怕的問題需要解決:Mysterious behavior of Dictionary<TKey, TSource>

是一切正確? 我應該指定任何其他編譯器選項或預處理器指令嗎?

PS: libmono命令行是:

/I"..\libgc\include 「/ I」 .. \ 「/ I」 .. \單\ 「/ I」 .. \ mono \ jit「 /I"..\mono\eglib\src」/I"....\mono\eglib\src「/I"..\eglib\src」/ Zi /nologo/W1/WX-/O1/Ob1/Oi/Oy-/D「NDEBUG」/ D「i386」/ D 「TARGET_X86」/ D「i386」/ D「WIN32」/ D「_WIN32」/ D「WIN32 「/ D 」_WINDOWS「/ D」WINDOWS「/ D」HOST_WIN32「/ D」TARGET_WIN32「/ D 」_CRT_SECURE_NO_DE PRECATE「/ D」GC_NOT_DLL「/ D」HAVE_CONFIG_H「/ D 」WINVER = 0x0500「/ D」_WIN32_WINNT = 0x0500「/ D」_WIN32_IE = 0x0501「/ D 」WIN32_THREADS「/ D」FD_SETSIZE = 1024「/ D」 default_codegen/MONO_ASSEMBLIES = 0/D「_UNICODE」/ D「UNICODE」/ GF/「。\ Release/libmono.pch」/「Win32 \ obj \ libmono \」/ Fo「Win32 \ obj \ libmono \」 /Fd「Win32 \ obj \ libmono \ -/errorReport:隊列

UPD:

我發現這個與我的問題有關的討論http://mono.1490590.n4.nabble.com/Mono-static-library-td3546774.html

這是真的嗎? 我可以使用SGen而不是Boehm嗎?如果是的話,任何提示非常感謝。 如果是,我可以使用單聲道作爲使用sgen的靜態庫嗎?

+1

這是一個奇怪的問題,考慮到你以前的問題顯示了你是如何通過運行單聲道靜態鏈接來拍攝你的腳的。 http://stackoverflow.com/questions/10717406/mysterious-behavior-of-dictionarytkey-tsource –

回答

2

現在一切都清楚了我。

Hans Passant回答了Mysterious behavior of Dictionary<TKey, TSource>,表明靜態鏈接不起作用。

這個問題的答案表明,有沒有可能選擇其他GC尚未: Compiling Mono from Visual Studio with sgen support

彙總,它的瞭解,nowdays在Windows上唯一的解決辦法是動態鏈接

+0

這很奇怪。我會認爲這不是一個答案。但是,作爲OP你是'有點'有權彎曲規則和改變你自己的問題。好吧。 – sehe

+0

這是你的權利,但我認爲它回答了所有的問題。 1)所做的一切都是正確的; 2)我不應該添加任何其他標誌,因爲一切都是正確的; 3)Boehm使用DllMain的情況仍然存在; 4)我不能在Windows上使用SGen而不是Boehm。每個問題都有答案,答案包含在這裏。當然在我看來。 – ILya

+0

好吧,可能除了問題標題是「將單聲道編譯爲靜態庫」。我虛心地提出,'Windows上唯一的解決方案是動態鏈接'不能被認爲是一個真正的答案。無論如何,無需捍衛,[我在我的第一個評論中捍衛了你](http://stackoverflow.com/questions/10719828/compilling-mono-as-static-library/10721707#comment13931419_10721707):) – sehe

3

我要跳過你的問題的細節,因爲我懷疑XY problem

如果你想創建一個靜態鏈接到單聲道運行的應用程序,只需使用mkbundle.exe

mcs Main.cs 
mkbundle --static --deps -z Main.exe -o Main 
ldd Main 

結果

[email protected]:~/Projects/SODemo/SODemo$ mkbundle --static --deps -z Main.exe -o Main 
OS is: Linux 
Note that statically linking the LGPL Mono runtime has more licensing restrictions than dynamically linking. 
See http://www.mono-project.com/Licensing for details on licensing. 
Sources: 1 Auto-dependencies: True 
    embedding: /home/sehe/Projects/SODemo/SODemo/Main.exe 
    compression ratio: 44,62% 
    embedding: /usr/lib/mono/4.0/mscorlib.dll 
    compression ratio: 34,99% 
    embedding: /usr/lib/mono/gac/System/4.0.0.0__b77a5c561934e089/System.dll 
    compression ratio: 37,49% 
    embedding: /usr/lib/mono/gac/Mono.Security/4.0.0.0__0738eb9f132ed756/Mono.Security.dll 
    compression ratio: 40,12% 
    embedding: /usr/lib/mono/gac/System.Configuration/4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll 
    compression ratio: 40,12% 
    embedding: /usr/lib/mono/gac/System.Xml/4.0.0.0__b77a5c561934e089/System.Xml.dll 
    compression ratio: 34,06% 
    embedding: /usr/lib/mono/gac/System.Security/4.0.0.0__b03f5f7f11d50a3a/System.Security.dll 
    compression ratio: 39,32% 
    embedding: /usr/lib/mono/gac/System.Core/4.0.0.0__b77a5c561934e089/System.Core.dll 
    compression ratio: 34,16% 
    embedding: /usr/lib/mono/gac/Mono.Posix/4.0.0.0__0738eb9f132ed756/Mono.Posix.dll 
    compression ratio: 40,01% 
Compiling: 
as -o temp.o temp.s 
cc -o Main -Wall `pkg-config --cflags mono-2` temp.c -lz `pkg-config --libs-only-L mono-2` -Wl,-Bstatic -lmono-2.0 -Wl,-Bdynamic `pkg-config --libs-only-l mono-2 | sed -e "s/\-lmono-2.0 //"` temp.o 
Done 
[email protected]:~/Projects/SODemo/SODemo$ ldd Main 
    linux-vdso.so.1 => (0x00007fff7b1ff000) 
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007ffe95d0f000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ffe95a8b000) 
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ffe95882000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ffe9567e000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ffe95461000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffe950bf000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007ffe95f52000) 

注意生成的可執行文件大小爲:5.8 Mb爲一個微不足道的程序。但它完全獨立。

+0

謝謝你的這種遊覽捆綁,但它是完全不同的,我需要什麼和我的問題是什麼。爲什麼你稱之爲XY問題?我做了一個嘗試。它不適合我。所以我要求更正描述嘗試的步驟。我不需要將託管程序集捆綁到我的可執行文件中。我需要靜態鏈接到libmono。我同意編輯我的問題,如果它不清楚,但現在我看不到它。 – ILya

+0

@ILya你的問題很清楚。目標不是。請注意,生成的可執行文件**靜態鏈接到libmono。還要注意,你可以不用**'--deps'來重複練習**,將一個程序集編譯成本地庫而不是完整的exe。這有幫助嗎? – sehe

+0

我不需要編譯任何程序集=)可以說我想mono.exe,但winth更多的功能,沒有單獨的mono-2.0.dll,即單個文件的可執行文件,我可以用一種方式「C:\ myapp \ mymono .exe D:\ dot-net-assembly.exe「。我已經有一個工作,除了字典<,>在dot-net-assembly.exe中使用的類隨機拋出奇怪的例外。這是由GC問題引起的。如果你有興趣,請看我自己的答案的細節。 – ILya