将单声道编译为静态库
Compiling mono as static library
我想在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上唯一的解决方案是动态链接
- cmake cuda在Windows上单独的编译静态LIB链接错误,但在Ubuntu上没有
- 使用 PostgreSQL 编译静态 Qt 5.10.0 时出错
- 如何编译静态OPENCV4库
- 用静态OPENSL 1.1.1A编译静态卷曲
- 编译静态库时收集所有头文件
- 如何使用Codelite 11.0.0编译静态库
- 使用标准库(静态)编译静态库链接
- 为什么包括-FPIC来编译静态库会在运行时会导致分割故障
- Eclipse CDT 编译静态库与主项目编译器设置
- 在 Visual Studio 2013 中编译静态库
- 如何从boost.python使用-fPIC编译静态库
- 编译静态库时出现 GCC 链接器错误
- 无法为arch armv7编译静态库
- SFML预编译静态库给出无法解决的外部符号错误
- 用CMake编译静态可执行文件
- C++编译静态变量和共享对象
- Android Studio交叉编译静态库
- 在VS2008和GCC中编译静态const int=X的最佳代码
- 在AIX 7.1 xlc++上编译静态模板函数
- 如何在MS VS中从大量.c和.h文件中编译静态库