将mono编译为静态库

我想在Windows上将libmono编译为静态库。

目标平台是Windows x86。 构建环境:Windows 7 64位,VC ++ Express 2010

我已经做了什么。

1)下载单声道2.10.8源。
2)从msvc文件夹中打开mono.sln并确保一切正在进行。
3)然后我做了一些改变:
3.1)常规 – >项目默认值 – >配置类型:静态库(.lib)
3.2)常规 – >项目默认值 – >使用MFC:使用标准Windows库
3.3)C / C ++ – >代码生成 – >运行时库:multithreading(/ MT)
4)构建它并且VC ++ 2010成功创建了mono-2.0.lib
5)在我自己的项目的链接器输入中添加它(我想嵌入单声道):
5.1)常规 – >项目默认值 – >配置类型:应用程序(.exe)
5.2)常规 – >项目默认值 – >使用MFC:在Ststic库中使用MFC
5.3)C / C ++ – >代码生成 – >运行时库:multithreading(/ MT)

它似乎工作接近完美但有一些可怕的问题: Dictionary 的神秘行为

一切都做得对吗? 我应该指定任何其他编译器选项或预处理器指令吗?

PS: libmono命令行是:

/I”..\libgc\include“/ I”.. \“/ I”.. \ mono \“/ 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_DEPRECATE” / 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 ”/ D “MONO_ASSEMBLIES = 0”/ D“_UNICODE”/ D“UNICODE”/ GF / Gm- / EHsc / MT / GS / Gy / fp:precise / Zc:wchar_t / Zc:forScope /Fp”.\Release/libmono.pch “/ Fa”Win32 \ obj \ libmono \“/ Fo”Win32 \ obj \ libmono \“/ Fd”Win32\obj\libmono\vc100.pdb”/ Gd / TC / analyze- / errorReport:queue

UPD:

我发现这个讨论与我的问题有关http://mono.1490590.n4.nabble.com/Mono-static-library-td3546774.html

它仍然是实际的吗? 我可以使用SGen而不是Boehm吗? 如果是的话,任何提示都非常感激。 如果是的话,我可以使用单声道作为使用sgen的静态库吗?

我将跳过你问题的细节,因为我怀疑是XY问题 。

如果要创建静态链接到单声道运行时的应用程序,只需使用mkbundle.exe

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

结果是

 sehe@mint12:~/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 sehe@mint12:~/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.8Mb,用于一个简单的程序。 但它完全独立的。

也可以看看

  • Monotouch链接器http://docs.xamarin.com/ios/advanced_topics/linker这将优化所有未使用的引用

  • Sebastian Poulliot的博客http://spouliot.wordpress.com/

现在一切都清楚了。

Hans Passant回答了字典的神秘行为 ,表明静态链接不起作用。

对这个问题的回答表明,还没有可能选择另一个GC: 从Visual Studio编译Mono并支持sgen

总而言之,据了解,现在Windows上唯一的解决方案是动态链接