Компиляция моно как статической библиотеки

Я хочу скомпилировать 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 МБ для тривиальной программы. Но это совершенно независимо.

Смотрите также

Другие вопросы по тегам