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

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

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


person akauppi    schedule 17.09.2008    source источник
comment
привет, работа, которую вы проделали 7 лет назад, мне нужна помощь, я студент, и мне нужно скомпилировать cairo1.8 (pixman 0.17) с моим vs2012, чтобы скомпилировать проект с открытым исходным кодом, дело в заголовке pixman c/cpp, и реализация находится на c, а мой компилятор cpp. как поступить   -  person Mohammed Housseyn Taleb    schedule 18.09.2015
comment
Может быть, вам следует сделать это отдельным вопросом StackOverflow? Вы можете дать ссылку на этот.   -  person akauppi    schedule 19.09.2015
comment
не могу задать вопрос :/   -  person Mohammed Housseyn Taleb    schedule 20.09.2015
comment
@MohammedHousseynTaleb Я успешно собрал cairo 1.14 для Visual Studio 2015. Смотрите мой ответ.   -  person jingyu9575    schedule 15.11.2015


Ответы (7)


Вот инструкции по сборке Cairo/Cairomm с помощью Visual C++.

Необходимый:

  • Visual C++ 2008 Express SP1 (теперь включает SDK)
  • МСИС 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 (код хороший).

    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 есть Makefiles для компилятора командной строки Visual C++ (cl), но они используют Gnu makefile и Unix-подобные инструменты (sed и т. д.). Это означает, что мы должны запустить make из MSYS.

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

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

Попробуйте, чтобы инструменты VC++ работали отсюда: '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, приправленном 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

кайромм (C++ API)

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

Существует проект Visual C++ 2005, который мы можем использовать (путем открытия и обновления) в 2008 году.

    cairomm-1.6.4\MSCV_Net2005\cairomm\cairomm.vcproj

Изменения, которые необходимо сделать:

  • Измените активную конфигурацию на «Выпуск».

  • Свойства 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
person akauppi    schedule 19.09.2008

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

Установить ГнуВин

Для сценариев сборки требуются инструменты командной строки 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

Не строить. Сценарий сборки использует 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 GnuWin, кавычки заставляют использовать последний)

Запустите нативную командную строку 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 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 Windows.

Перед #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
person jingyu9575    schedule 15.11.2015

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

person Stuart Axon    schedule 09.03.2010

Вы проверили здесь: http://cairographics.org/visualstudio/? Что вы имеете в виду «Он использует среду выполнения MSCVRT, которая несовместима с Visual C++ 2005/2008»? Какие именно проблемы у вас возникли?

person Roel    schedule 18.09.2008

При сборке в Windows я столкнулся с двумя проблемами (Visual Studio 2008, GNU Make 3.81):

  1. Неверные конструкции if в src/Makefile.sources. Исправлено это с помощью

    sed "s/^if \([A-Z_]*\)$/ifeq ($(\1), 1)/" src\Makefile.sources
    
  2. _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).

person Sergeq    schedule 15.07.2011

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

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

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

person jfs    schedule 18.09.2008

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

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

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

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

person akauppi    schedule 18.09.2008