我想在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”..libgcinclude“/ I”.. “/ I”.. mono “/ I”..monojit”/I”..monoeglibsrc“/ I “…. mono eglib src”/I”..eglibsrc“/ 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”Win32objlibmonovc100.pdb”/ Gd / TC / analyze- / errorReport:queue
UPD:
我发现这个讨论与我的问题有关https://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 https://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,用于一个简单的程序。 但它是完全独立的。
也可以看看
现在一切都清楚了。
Hans Passant回答了字典
对这个问题的回答表明,还没有可能选择另一个GC: 从Visual Studio编译Mono并支持sgen
总而言之,据了解,现在Windows上唯一的解决方案是动态链接
以上就是c/c++开发分享将mono编译为静态库相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549576.html