我想在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 ++ - >代码生成 - >运行时库:多线程(/ MT)
4)构建它并且VC ++ 2010成功创建了mono-2.0.lib
5)在我自己的项目的链接器输入中添加它(我想嵌入单声道):
5.1)常规 - >项目默认值 - >配置类型:应用程序(.exe)
5.2)General-> Project Defaults-> MFC的使用:在Ststic Library中使用MFC
5.3)C / C ++ - >代码生成 - >运行时库:多线程(/ MT)
似乎工作接近完美,但有一些可怕的问题:Mysterious behavior of Dictionary<TKey, TSource>
一切都做得对吗? 我应该指定任何其他编译器选项或预处理器指令吗?
P.S。: 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吗?如果是的话,非常感谢任何提示。 如果是的话,我可以使用mono作为使用sgen的静态库吗?
答案 0 :(得分:4)
我将跳过你问题的详细信息,因为我怀疑是XY problem。
如果要创建静态链接到单声道运行时的应用程序,只需使用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/
答案 1 :(得分:2)
现在一切都很清楚。
Hans Passant回答Mysterious behavior of Dictionary<TKey, TSource>,表明静态链接不起作用。
对这个问题的回答表明,还没有可能选择另一个GC: Compiling Mono from Visual Studio with sgen support
总结一下,据了解,现在windows上唯一的解决方案是动态链接