Как скомпилировать Cairo для Visual С++ 2008 (Express Edition)

Большинство предварительно скомпилированных двоичных файлов Windows создаются с помощью инструментальных средств MSYS + gcc. Он использует среду выполнения MSVCRT, которая несовместима с Visual С++ 2005/2008.

Итак, как сходить и скомпилировать Cairo 1.6.4 (или новее) только для Visual С++. Включая зависимости (png, zlib, pixman).

Ответ 1

Вот инструкции по созданию Cairo/Cairomm с Visual С++.

Требуется:

  • Visual С++ 2008 Express SP1 (теперь включает SDK)
  • MSYS 1.0

Чтобы использовать инструменты командной строки VС++, необходимо запустить командный файл '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

Компилятор VС++ 9.0 предоставляет множество предупреждений "это может быть опасно". Игнорируй их; это паника безопасности MS (код хороший).

    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

Pixman - часть Каира, но отдельная загрузка.

Загрузить (и извлечь) pixman-0.12.0.tar.gz из http://www.cairographics.org/releases/

Используйте MSYS для распаковки через 'tar -xvzf pixman *.tar.gz'

Оба Pixman и Cairo имеют Makefile для компилятора командной строки Visual С++ (cl), но они используют Gnu makefile и Unix-подобные инструменты (sed и т.д.). Это означает, что мы имеем для запуска make из MSYS.

Откройте командную строку с включенными инструментами командной строки VС++ (попробуйте 'cl/?'). Поверните эту командную строку в приглашении MSYS с помощью "C:\MSYS\1.0\MSYS.BAT".

НЕ ИСПОЛЬЗУЙТЕ значок MSYS, потому что тогда ваша подсказка теперь узнает о VС++. Вы не можете запускать .bat файлы из MSYS.

Попробуйте использовать инструменты VС++ здесь: 'cl -?'

Попробуйте сделать 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 с поддержкой VС++ для компиляции также 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 ". Используйте подготовленную вручную (в Каире > 1.6.4 может быть "src/cairo-features-win32.h", что вы можете просто переименуйте):

    cp ../cairo-features.h src/

Повторите команду make (стрелка вверх помнит об этом).

    ls src/release
        #
        # cairo-static.lib

cairomm (API С++)

Загрузить (и извлечь) cairomm-1.6.4.tar.gz из http://www.cairographics.org/releases/

Существует проект Visual С++ 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' и 'build'. Существуют некоторые предупреждения.

    dir cairomm-1.6.4\MSVC_Net2005\cairomm\Release
        #
        # cairomm-1.0.lib
        # cairomm-1.0.dll
        # cairomm.def

Ответ 2

Эти шаги могут построить последний cairo в 2015-11-15 для сообщества Visual Studio 2015. Отладочная сборка - это DLL, связанная с DLL-версией CRT. Сборка релиза - это статическая библиотека, связанная со статической ссылкой на CRT и не требующая DLL.

Установить GnuWin

Для скриптов сборки требуются инструменты командной строки GNU. Следующие шаги проверяются с помощью GnuWin из Chocolatey. MSYS также может работать.

Скачать

zlib128.zip, lpng1619.zip, cairo-1.14.4.tar.xz, pixman-0.32.8.tar.gz

Извлечь

Извлеките эти архивы и переименуйте каталоги:

. (my_cairo_build_root)
├─cairo
├─libpng
├─pixman
└─zlib

Zlib

Не создавайте. В сборке script используется MSVCRT, который сталкивается с Visual Studio 2015. Используйте сгенерированный lib из сборки libpng.

Libpng

Изменить libpng\projects\vstudio\zlib.props:

  • in <ZLibSrcDir> удалите номер версии: ..\..\..\..\zlib
  • в <WindowsSDKDesktopARMSupport> измените true на false

Откройте libpng\projects\vstudio\vstudio.sln в Visual Studio и подтвердите обновление. Используйте конфигурацию по умолчанию Debug и щелкните правой кнопкой мыши проект libpng для сборки. Перейдите в конфигурацию Release Library и щелкните правой кнопкой мыши проект libpng для сборки.

pixman

Изменить pixman\Makefile.win32.common:

  • Замените CFG_CFLAGS = -MD -O2 на CFG_CFLAGS = -MT -O2 (ссылка на статическую версию CRT в версии сборки)
  • Замените @mkdir на @"mkdir" (есть cmd builtin mkdir и GnuWin mkdir, кавычки заставляют последний использовать)

Запустите Visual Basic для 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"

В GnuWin есть непригодный link.exe. Переименуйте C:\GnuWin\bin\link.exe в link_.exe, чтобы избежать столкновения.

Запустите Visual Basic для 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 в один из Windows '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

Ответ 3

Инструкции, похоже, не работают с текущей версией imlib, интересно, стоит ли заново задавать этот вопрос?

Ответ 4

Вы проверили здесь: http://cairographics.org/visualstudio/? Что вы подразумеваете "Использует MSCVRT runtime, что несовместимо с Visual С++ 2005/2008"? Каковы конкретные проблемы, с которыми вы сталкиваетесь?

Ответ 5

Я столкнулся с двумя проблемами при создании на 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).

Ответ 6

MSYS + gcc toolchain использует старую библиотеку времени исполнения MSVCRT (теперь встроенную в Windows), а Visual С++ 2005/2008 приносит свои собственные. Это известный факт, что код не должен зависеть от нескольких режимов работы. Передача вещей с .a. файловые дескрипторы, указатели на память и т.д. будут затронуты и будут приводить к случайным сбоям в таком сценарии.

Я не был упущен этим. Опять же, я больше не нацелен на Windows. Но мне сказали достаточно, чтобы даже не попробовать решение.

Что могло бы сработать, связывает все зависимости статически в lib (скажем, Cairomm). У статических библиотек нет привязки к ним, не так ли? Но я не пробовал это. Я фактически получил VС++ здание всех ингредиентов для работы, но потребовалось несколько дней.

Я не нашел URL, который вы указали. Странный сам по себе; Я смотрел "везде". Опять же, это для Visual Studio 2003.NET, поэтому уже есть два поколения.

Ответ 7

Я сделал это, но у меня нет готовых письменных инструкций. Мои сборки также минимальны, так как мне не нужна поддержка, например. PNG и SVG, я просто использовал его для рендеринга созданной векторной графики для буферов памяти.

Но то, что я сделал, было прочитано через config.h и другие файлы для системы сборки UNIX/GNU и написано мое собственное приложение для MSVC, а затем создало проект с соответствующими исходными файлами. Вероятно, для этого нужно всего несколько часов, но когда вы закончите, это просто работает;)

Изменить: см. эту страницу, у нее есть проект MSVC 2003 (7.1) для создания cairo: http://slinavlee.googlepages.com/