编译单静态库(Compiling mono as static library)

2019-09-17 10:42发布

我想在Windows中编译libmono作为静态库。

目标平台是Windows 86。 构建环境:Windows 7 64位,VC ++快讯2010年

我已经做了。

1)下载单2.10.8源。
2)打开mono.sln从MSVC文件夹,并确保一切都compilling。
3)然后我做了一些变化:
3.1)通用>项目Defaults->配置类型:静态库(.LIB)
3.2)常规 - > MFC项目Defaults->使用:使用标准的Windows库
3.3)C / C ++ - >代码发生 - >运行时库:多线程(/ MT)
4)内置它和VC ++ 2010成功创建单2.0.lib
5)增加了它在我自己的项目中连接器的输入(即我想嵌入单声道):
5.1)通用>项目Defaults->配置类型:Application(.EXE)
5.2)常规 - >项目Defaults->使用MFC的:使用MFC的Ststic库
5.3)C / C ++ - >代码发生 - >运行时库:多线程(/ MT)

看来近乎完美的,但有一些可怕的问题需要解决: 词典的神秘行为<TKEY的,TSource>

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

PS:libmono命令行是:

/I"..\libgc\include “/ I” .. \ “/ I” .. \单声道\ “/I"..\mono\jit” /I"..\mono\eglib\src” / I “.... \单\ eglib \ SRC” /I"..\eglib\src” /紫/ 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 /格雷/ FP:精确/ 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:队列

UPD:

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

它仍然是实际? 我可以使用SGEN代替贝姆? 如果是的话,任何提示是非常赞赏。 如果是,我可以再使用单声道与使用SGEN的静态库?

Answer 1:

我要去,因为我怀疑是跳过你的问题的细节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这优化了所有未使用的引用

  • 塞巴斯蒂安Poulliot的博客http://spouliot.wordpress.com/



Answer 2:

现在一切都清楚了我。

汉斯帕桑特给了一个答案, 词典的神秘行为<TKEY的,TSource>这表明,静态链接将无法正常工作。

这个问题的答案表明,有没有可能选择其他GC尚未: 编译单从Visual Studio中查看sgen支持

总之,它的了解,nowdays在Windows上唯一的解决办法是在动态链接



文章来源: Compiling mono as static library