c++ - Compilando mono como biblioteca estática
embed static-linking (2)
Voy a omitir los detalles de su pregunta porque sospecho que hay un problema XY .
Si desea crear una aplicación que esté vinculada estáticamente al tiempo de ejecución mono, simplemente use mkbundle.exe
:
mcs Main.cs
mkbundle --static --deps -z Main.exe -o Main
ldd Main
resultados en
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)
Tenga en cuenta que el tamaño del ejecutable resultante es: 5.8Mb para un programa trivial. Pero es completamente independiente.
Ver también
Enlazador Monotouch http://docs.xamarin.com/ios/advanced_topics/linker Esto optimiza todas las referencias no utilizadas
El blog de Sebastian Poulliot http://spouliot.wordpress.com/
Quiero compilar libmono como biblioteca estática en Windows.
La plataforma objetivo es Windows x86. Entorno de compilación: Windows 7 de 64 bits, VC ++ Express 2010
Lo que ya he hecho
1) Fuentes descargadas de mono 2.10.8.
2) Se abrió mono.sln desde la carpeta msvc y se aseguró de que todo se estaba completando.
3) Luego hice algunos cambios:
3.1) General-> Valores predeterminados del proyecto-> Tipo de configuración: Biblioteca estática (.lib)
3.2) General-> Valores predeterminados del proyecto-> Uso de MFC: use las bibliotecas estándar de Windows
3.3) C / C ++ -> Generación de código-> Biblioteca de tiempo de ejecución: Multi-threaded (/ MT)
4) Lo compiló y VC ++ 2010 creó con éxito mono-2.0.lib
5) Lo agregué en las entradas del enlazador de mi propio proyecto (en el que quiero incrustar el mono) con:
5.1) General-> Proyecto Predeterminado-> Tipo de configuración: Aplicación (.exe)
5.2) General-> Valores Predeterminados del Proyecto-> Uso de MFC: Use MFC en una Biblioteca Ststic
5.3) C / C ++ -> Generación de código-> Biblioteca de tiempo de ejecución: Multi-threaded (/ MT)
Parece funcionar casi perfecto, pero con algunos problemas terribles: comportamiento misterioso de Dictionary <TKey, TSource>
¿Todo está hecho correctamente? ¿Debo especificar otras opciones de compilador o directivas de preprocesador?
PD: la línea de comando de libmono es:
/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: preciso / 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: cola
UPD:
Encontré esta discusión que está relacionada con mi pregunta http://mono.1490590.n4.nabble.com/Mono-static-library-td3546774.html
¿Sigue siendo real? ¿Puedo usar SGen en lugar de Boehm? Si es así, cualquier consejo es muy apreciado. Y si es así, ¿puedo usar mono como una biblioteca estática con el uso de sgen?
Todo está claro para mí ahora.
Hans Passant dio una respuesta al comportamiento Misterioso del Diccionario <TKey, TSource> que muestra que los enlaces estáticos no funcionarán.
La respuesta a esta pregunta muestra que aún no hay posibilidades de elegir otro GC: compilación de Mono desde Visual Studio con soporte sgen
Resumiendo, se entiende que hoy en día la única solución en Windows es la vinculación dinámica