将单声道编译为静态库

Compiling mono as static library

本文关键字:编译 静态 声道 单声道      更新时间:2023-10-16

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

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

我已经做了什么。

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

它似乎近乎完美,但存在一些可怕的问题:字典的神秘行为<TKey,Sucherce>

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

附言:libmono命令行是:

/我"..\libgc\include"/I"..\"/I"..\mono\"/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 "窗口"/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

上级:

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

它仍然是实际的吗?我可以使用SGen代替Boehm吗?如果是,非常感谢任何提示。如果是,那么我可以使用 sgen 将 mono 用作静态库吗?

我将跳过您问题的细节,因为我怀疑存在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。但它完全独立的。

参见

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

  • 塞巴斯蒂安·普利奥特的博客 http://spouliot.wordpress.com/

现在对我来说一切都清楚了。

Hans Passant给出了字典<TKey,TSource的神秘行为的答案>这表明静态链接不起作用。

这个问题的回答表明,目前还没有选择另一个GC的可能性:使用 sgen 从 Visual Studio 编译 Mono

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