c++ - 将单声道编译为静态库

标签 c++ c mono embed static-linking

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

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

我已经做了什么。

1) 下载了 mono 2.10.8 源代码。
2) 从 msvc 文件夹中打开 mono.sln 并确保一切正常。
3)然后我做了一些改变:
3.1) General->Project Defaults->Configuration Type: Static library (.lib)
3.2) General->Project Defaults->Use of MFC: Use Standard Windows Libraries
3.3) C/C++->代码生成->运行库:多线程(/MT)
4) 编译成功,VC++ 2010成功创建mono-2.0.lib
5) 在我自己的项目(我想嵌入单声道)的链接器输入中添加它:
5.1) General->Project Defaults->Configuration Type: Application (.exe)
5.2) General->Project Defaults->Use of MFC: Use MFC in a Ststic Library
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

更新:

我找到了与我的问题相关的讨论 http://mono.1490590.n4.nabble.com/Mono-static-library-td3546774.html

它还是真实的吗? 我可以使用 SGen 而不是 Boehm 吗?如果是,任何提示都非常感谢。 如果是,我可以使用 sgen 将 mono 用作静态库吗?

最佳答案

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

如果你想创建一个静态链接到 mono 运行时的应用程序,只需使用 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 对于普通程序。但它完全独立的。

另见

关于c++ - 将单声道编译为静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10719828/

相关文章:

c++ - libusb_get_device_with_vid_pid 上的段错误

c++ - iostream 的二进制版本

c - 无法将字符串保存到 log.txt

c++ - Rcpp第一次编译遇到问题

c - 如何使用套接字传输pdf、mp3或mp4文件?

c# - 用于大量插件的 MEF

java - 如何用Java代码重写或转换C#代码?

c# - 如何使 "mkbundle --deps"选项与单声道 3.2.3 一起使用

c++ - MFC 对话框应用程序中的错误

c++ - using 指令如何影响 C++ 中的函数参数?