Компиляция моно как статической библиотеки
Я хочу скомпилировать libmono как статическую библиотеку в Windows.
Целевая платформа - Windows x86. Среда сборки: Windows 7, 64-битная, VC++ Express 2010
Что я уже сделал.
1) Загруженные моно 2.10.8 источников.
2) Открыл mono.sln из папки msvc и убедился, что все компилируется.
3) Затем я сделал некоторые изменения:
3.1) General-> Project Defaults-> Тип конфигурации: Статическая библиотека (.lib)
3.2) General-> Project Defaults-> Use MFC: Использовать стандартные библиотеки Windows
3.3) C / C++ -> Генерация кода-> Библиотека времени выполнения: многопоточная (/MT)
4) Построил его и VC++ 2010 успешно создал mono-2.0.lib
5) Добавил его во входные данные компоновщика моего собственного проекта (в который я хочу вставить моно) с помощью:
5.1) General-> Project Defaults-> Тип конфигурации: Приложение (.exe)
5.2) General-> Project Defaults-> Use MFC: Использовать MFC в библиотеке Ststic
5.3) C/C++-> Генерация кода-> Библиотека времени выполнения: многопоточная (/MT)
Кажется, он работает почти идеально, но с некоторыми ужасными проблемами: Таинственное поведение словаря
Все ли сделано правильно? Должен ли я указать какие-либо другие параметры компилятора или директивы препроцессора?
PS: командная строка 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_DEPRATE /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" "D_D__DET_IZE" D_D_G_D =1024" "MONO_ASSEMBLIES=0" /D "_UNICODE" /D "UNICODE" /GF / Гм - /EHsc /MT /GS /Gy /fp: точный /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 /analysis- /errorReport: очередь
UPD:
Я нашел это обсуждение, которое связано с моим вопросом http://mono.1490590.n4.nabble.com/Mono-static-library-td3546774.html
Это все еще актуально? Могу ли я использовать SGen вместо Boehm? Если да, любой совет очень ценится. И если да, то могу ли я использовать моно в качестве статической библиотеки с использованием sgen?
2 ответа
Теперь мне все ясно.
Ханс Пассант дал ответ на Таинственное поведение словаря
Ответ на этот вопрос показывает, что пока нет возможности выбрать другой GC: Компиляция Mono из Visual Studio с поддержкой sgen
Подводя итог, понятно, что в настоящее время единственным решением для Windows является динамическое связывание
Я собираюсь пропустить детали вашего вопроса, потому что я подозреваю, что проблема 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,8 МБ для тривиальной программы. Но это совершенно независимо.
Смотрите также
Monotouch linker http://docs.xamarin.com/ios/advanced_topics/linker Это оптимизирует все неиспользуемые ссылки
Блог Себастьяна Поллиота http://spouliot.wordpress.com/