Как скомпилировать Cairo для Visual C ++ 2008 (Express edition)
-
01-07-2019 - |
Вопрос
Большинство предварительно скомпилированных двоичных файлов Windows создаются с помощью набора инструментов MSYS + gcc.Он использует среду выполнения MSVCRT, которая несовместима с Visual C ++ 2005/2008.
Итак, как приступить к компиляции Cairo 1.6.4 (или более поздней версии) только для Visual C ++.Включая зависимости (png, zlib, pixman).
Решение
Вот инструкции по сборке Cairo / Cairomm с Visual C ++.
Требуемый:
- Visual C ++ 2008 Express с пакетом обновления 1 (теперь включает SDK)
- MSYS 1.0
Чтобы использовать инструменты командной строки VC ++, необходимо запустить пакетный файл 'vcvars32.bat'.
C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vcvars32.bat
ZLib
Загрузить (и извлечь) zlib123.zip с http://www.zlib.net/
cd zlib123 nmake /f win32/Makefile.msc dir # zlib.lib is the static library # # zdll.lib is the import library for zlib1.dll # zlib1.dll is the shared library
libpng
Загрузить (и извлечь) lpng1231.zip с http://www.libpng.org/pub/png/libpng.html
Компилятор VC ++ 9.0 выдает множество предупреждений типа "это может быть небезопасно".Игнорируйте их;это MS security panic (код хороший).
cd lpng1231\lpng1231 # for some reason this is two stories deep nmake /f ../../lpng1231.nmake ZLIB_PATH=../zlib123 dir # libpng.lib is the static library # # dll is not being created
Пиксельман
Pixman является частью Cairo, но доступен для отдельной загрузки.
Загрузить (и извлечь) pixman-0.12.0.tar.gz с http://www.cairographics.org/releases/
Используйте MSYS для разблокировки через 'tar -xvzf pixman *.tar.gz'
И Pixman, и Cairo имеют Makefile-файлы для компилятора командной строки Visual C ++ (cl), но они используют Gnu makefile и Unix-подобные инструменты (sed и т.д.).Это означает, что мы должны запустить make из MSYS.
Откройте командную строку с включенными средствами командной строки VC ++ (попробуйте 'cl /?').Превратите эту командную строку в приглашение MSYS с помощью 'C:\MSYS\1.0\MSYS.BAT'.
НЕ используйте значок MSYS, потому что тогда ваша подсказка теперь будет знать о VC ++.Вы не можете запускать файлы .bat из MSYS.
Попробуйте, чтобы инструменты VC ++ работали отсюда:-кл...?
Попробуйте, что Gnu make тоже работает:"make -v".
Прохладный.
cd (use /d/... instead of D:) cd pixman-0.12.0/pixman make -f Makefile.win32
По умолчанию используются оптимизации MMX и SSE2, для которых требуется новый процессор x86 (Pentium 4 или Pentium M или выше: http://fi.wikipedia.org/wiki/SSE2 )
Есть довольно много предупреждений, но, похоже, это удается.
ls release # pixman-1.lib (static lib required by Cairo)
Оставайтесь в приглашении MSYS с добавлением VC ++, чтобы также скомпилировать Cairo.
каир
Загрузить (и извлечь) cairo-1.6.4.tar.gz с http://www.cairographics.org/releases/
cd cd cairo-1.6.4
Приведенный здесь Makefile.win32 почти хорош, но имеет жестко заданный путь Pixman.
Используйте измененный 'Makefile-cairo.win32':
make -f ../Makefile-cairo.win32 CFG=release \ PIXMAN_PATH=../../pixman-0.12.0 \ LIBPNG_PATH=../../lpng1231 \ ZLIB_PATH=../../zlib123
(Напишите все в одной строке, игнорируя обратную косую черту)
В нем говорится: "нет правила для создания "src / cairo-features.h".Используйте подготовленный вручную (в Cairo > 1.6.4 может быть 'src/cairo-features-win32.h', который вы можете просто переименовать):
cp ../cairo-features.h src/
Повторите команду make (стрелка вверх запоминает ее).
ls src/release # # cairo-static.lib
cairomm (C ++ API)
Загрузить (и извлечь) cairomm-1.6.4.tar.gz с http://www.cairographics.org/releases/
Существует проект Visual C ++ 2005, который мы можем использовать (через open & upgrade) для 2008.
cairomm-1.6.4\MSCV_Net2005\cairomm\cairomm.vcproj
Изменения, которые необходимо внести:
Измените активную конфигурацию на "Release".
Свойства Cairomm-1.0 (с помощью контекстного меню)
C++/General/Additional Include Directories: ..\..\..\cairo-1.6.4\src (append to existing) Linker/General/Additional library directories: ..\..\..\cairo-1.6.4\src\release ..\..\..\lpng1231\lpng1231 ..\..\..\zlib123 Linker/Input/Additional dependencies: cairo-static.lib libpng.lib zlib.lib msimg32.lib
- Оптимизация:быстрый код FPU
C++/Code generation/Floating point model Fast
Щелкните правой кнопкой мыши на "cairomm-1.0" и "построить".Есть несколько предупреждений.
dir cairomm-1.6.4\MSVC_Net2005\cairomm\Release # # cairomm-1.0.lib # cairomm-1.0.dll # cairomm.def
Другие советы
Эти шаги помогут создать последнюю версию cairo 2015-11-15 для сообщества Visual Studio 2015.Отладочная сборка представляет собой DLL, ссылающуюся на DLL-версию CRT.Релизная сборка представляет собой статическую библиотеку, связанную со статической версией CRT и не требующую библиотек DLL.
Установить GnuWin
Для создания сценариев требуются инструменты командной строки GNU.Следующие шаги тестируются с помощью ГнуВин от Chocolatey.MSYS также может сработать.
Скачать
zlib128.zip, lpng1619.zip, каир-1.14.4.tar.xz, pixman-0.32.8.tar.gz
Извлечь
Извлеките эти архивы и переименуйте каталоги:
. (my_cairo_build_root)
├─cairo
├─libpng
├─pixman
└─zlib
zlib
Не стройте.Сценарий сборки использует MSVCRT, который конфликтует с Visual Studio 2015.Используйте сгенерированную библиотеку из сборки libpng.
libpng
Редактировать libpng\projects\vstudio\zlib.props
:
- в
<ZLibSrcDir>
удалите номер версии:..\..\..\..\zlib
- в
<WindowsSDKDesktopARMSupport>
изменениеtrue
Дляfalse
Открыть libpng\projects\vstudio\vstudio.sln
зайдите в Visual Studio и подтвердите обновление.Используйте значение по умолчанию Debug
настройка и щелкните правой кнопкой мыши проект libpng
строить.Переключиться на Release Library
настройте и щелкните правой кнопкой мыши проект libpng
строить.
пиксельман
Редактировать pixman\Makefile.win32.common
:
- Заменить
CFG_CFLAGS = -MD -O2
сCFG_CFLAGS = -MT -O2
(ссылка на версию CRT со статической ссылкой в сборке релиза) - Заменить
@mkdir
с@"mkdir"
(естьcmd
встроенныйmkdir
и у Гнувинаmkdir
, кавычки вынуждают использовать последнее)
Запустите встроенную командную строку Visual Studio x86 из меню "Пуск":
cd /d my_cairo_build_root
cd pixman\pixman
make -f Makefile.win32
make -f Makefile.win32 CFG=debug
каир
Редактировать cairo\build\Makefile.win32.common
:
- Заменить
CFG_CFLAGS = -MD -O2
сCFG_CFLAGS = -MT -O2
- Заменить
CAIRO_LIBS += $(LIBPNG_PATH)/libpng.lib
сCAIRO_LIBS += $(LIBPNG_PATH)/lib/$(CFG)/libpng16.lib
.Теперь скопируйте каталогlibpng\projects\vstudio\Debug
в (созданный)libpng\lib\
и переименуйте его вdebug
.Скопируйте каталогlibpng\projects\vstudio\Release Library
вlibpng\lib\
и переименуйте его вrelease
. - Заменить
CAIRO_LIBS += $(ZLIB_PATH)/zdll.lib
сCAIRO_LIBS += $(LIBPNG_PATH)/lib/$(CFG)/zlib.lib
Есть два варианта
@mkdir -p $(CFG)/`dirname $<`
линии.Замените их оба на:@"mkdir" -p $(CFG)/$< @"rmdir" $(CFG)/$<
Редактировать cairo\build\Makefile.win32.features-h
:
- Заменить все
@echo
с@"echo"
Есть непригодный для использования link.exe
в Гнувине.Переименовать C:\GnuWin\bin\link.exe
Для link_.exe
чтобы избежать столкновения.
Запустите встроенную командную строку Visual Studio x86 из меню "Пуск":
cd /d my_cairo_build_root
cd cairo
make -f Makefile.win32 CFG=debug
make -f Makefile.win32 CFG=release
Последние две команды покажут "Built successfully!"
но возвращает ошибку.Игнорируй их.
Переименовать обратно C:\GnuWin\bin\link.exe
.
Настройка Visual Studio
Создайте каталог include
и скопируйте следующие заголовки в:
cairo\cairo-version.h
(неcairo\src\cairo-version.h
)cairo\src\*.h
, исключаяcairo\src\cairo-version.h
Добавьте этот каталог для включения пути в Visual Studio.
Добавить cairo\src\$(Configuration)
и libpng\lib\$(Configuration)
путь к библиотеке. $(Configuration)
автоматически расширится до Debug
или Release
при строительстве.
Положить cairo\src\debug\cairo.dll
и libpng\lib\debug\libpng16.dll
к одному из окон ' PATH
.
До того, как #include <cairo.h>
, настройте параметры ссылки:
#ifndef NDEBUG
# pragma comment(lib, "cairo")
#else
#define CAIRO_WIN32_STATIC_BUILD
# pragma comment(lib, "cairo-static")
# pragma comment(lib, "libpng16")
# pragma comment(lib, "zlib")
#endif
Инструкции, похоже, не работают с текущей версией imlib, интересно, стоит ли повторно задавать этот вопрос?
Вы проверяли здесь: http://cairographics.org/visualstudio/ ?Что вы имеете в виду под "Он использует среду выполнения MSCVRT, которая несовместима с Visual C ++ 2005/2008"?С какими именно проблемами вы столкнулись?
Я столкнулся с двумя проблемами при сборке в Windows (Visual Studio 2008, GNU Make 3.81).:
Недопустимые конструкции "if" в src /Makefile.sources.Исправил это с помощью
sed "s/^if \([A-Z_]*\)$/ifeq ($(\1), 1)/" src\Makefile.sources
_lround
недоступен в Windows / MSVC.Обошелся без этого, используяsed "s/#define _cairo_lround lround/static inline long cairo_const _cairo_lround(double r) { return (long)floor(r + .5); }/"`
(что, вероятно, является плохим решением)
Если отбросить эти проблемы, все работает отлично (как для архитектур x86, так и для x86_64).
Я сделал это, но у меня нет никаких готовых инструкций.Мои сборки также довольно минимальны, так как я не нуждался в поддержке, например.Файлы PNG и SVG, я просто использовал их для рендеринга сгенерированной векторной графики в буферы памяти.
Но то, что я сделал, было прочитано через config.h
и другие файлы для системы сборки UNIX / GNU и написать свой собственный, подходящий для MSVC, а затем создать проект с соответствующими исходными файлами.Вероятно, на это уйдет в лучшем случае несколько часов, но когда вы закончите, это просто сработает ;)
Редактировать:Смотрите эту страницу, на ней есть проект MSVC 2003 (7.1) для создания cairo: http://slinavlee.googlepages.com/
Набор инструментов MSYS + gcc использует старую библиотеку времени выполнения MSVCRT (теперь встроенную в Windows), а Visual C ++ 2005/2008 предлагает свою собственную.Это известный факт этот код не должен зависеть от нескольких сред выполнения.Передача вещей по назначению.дескрипторы файлов, указатели на память и т.д.будут затронуты и вызовут, по-видимому, случайные сбои в таком сценарии.
Меня это не задело.С другой стороны, я тоже больше не ориентируюсь на Windows.Но мне сказали достаточно, чтобы я даже не пробовал это решение.
Что могло бы сработать, так это статическое связывание всех зависимостей с библиотекой (скажем, Cairomm).Статические библиотеки не привязаны к среде выполнения, не так ли?Но я этого не пробовал.Я действительно запустил сборку VC ++ из всех ингредиентов, но на это ушло несколько дней.
Я не нашел указанный вами URL-адрес.Странный сам по себе;Я посмотрел "везде".Опять же, это для Visual Studio 2003.NET, так что уже на два поколения позади.