Cómo compilar Cairo para Visual C++ 2008 (edición Express)
-
01-07-2019 - |
Pregunta
La mayoría de los archivos binarios precompilados de Windows se crean con la cadena de herramientas MSYS+gcc.Utiliza el tiempo de ejecución MSVCRT, que es incompatible con Visual C++ 2005/2008.
Entonces, cómo compilar Cairo 1.6.4 (o posterior) solo para Visual C++.Incluyendo dependencias (png,zlib,pixman).
Solución
Aquí hay instrucciones para construir Cairo/Cairomm con Visual C++.
Requerido:
- Visual C++ 2008 Express SP1 (ahora incluye SDK)
- MSYS 1.0
Para utilizar las herramientas de línea de comandos de VC++, se debe ejecutar un archivo por lotes 'vcvars32.bat'.
C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vcvars32.bat
ZLib
Descargue (y extraiga) zlib123.zip de 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
Descargue (y extraiga) lpng1231.zip de http://www.libpng.org/pub/png/libpng.html
El compilador VC++ 9.0 ofrece muchas advertencias de "esto podría ser inseguro".Ingnóralos;esto es pánico de seguridad de MS (el código es bueno).
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 es parte de Cairo, pero es una descarga independiente.
Descargue (y extraiga) pixman-0.12.0.tar.gz de http://www.cairographics.org/releases/
Utilice MSYS para descomprimir mediante 'tar -xvzf pixman*.tar.gz'
Tanto Pixman como El Cairo tiene makingfiles para el compilador de línea de comandos Visual C ++ (CL), pero usan GNU Makefile y herramientas similares a Unix (SED, etc.).Esto significa que tenemos que ejecutar la marca desde MSYS.
Abra un símbolo del sistema con las herramientas de línea de comandos VC++ habilitadas (pruebe con 'cl /?').Convierta ese símbolo del sistema en un símbolo del sistema MSYS mediante 'C:\MSYS\1.0\MSYS.BAT'.
NO use el ícono MSYS, porque entonces su mensaje ahora sabrá de VC++.No puede ejecutar archivos .bat desde MSYS.
Pruebe que las herramientas VC++ funcionan desde aquí:'cl-?'
Prueba que Gnu make también funciona:'hacer -v'.
Fresco.
cd (use /d/... instead of D:) cd pixman-0.12.0/pixman make -f Makefile.win32
Este valor predeterminado a las optimizaciones MMX y SSE2, que requieren un procesador X86 nuevo (Pentium 4 o Pentium más arriba: http://fi.wikipedia.org/wiki/SSE2 )
Hay bastantes advertencias pero parece tener éxito.
ls release # pixman-1.lib (static lib required by Cairo)
Permanezca en el indicador MSYS especiado de VC++ para que Cairo también pueda compilar.
El Cairo
Descargue (y extraiga) cairo-1.6.4.tar.gz desde http://www.cairographics.org/releases/
cd cd cairo-1.6.4
El Makefile.win32 aquí es casi bueno, pero tiene la ruta Pixman cableada.
Utilice el 'Makefile-cairo.win32' modificado:
make -f ../Makefile-cairo.win32 CFG=release \ PIXMAN_PATH=../../pixman-0.12.0 \ LIBPNG_PATH=../../lpng1231 \ ZLIB_PATH=../../zlib123
(Escribe todo en una línea, ignorando las barras invertidas)
Dice "no hay regla para crear 'src/cairo-features.h'.Use el preparado manualmente (en El Cairo> 1.6.4 puede haber un 'Src/Cairo-Features-Win32.h' que simplemente puede cambiar el nombre):
cp ../cairo-features.h src/
Vuelva a intentar el comando make (la flecha hacia arriba lo recuerda).
ls src/release # # cairo-static.lib
cairomm (API C++)
Descargue (y extraiga) cairomm-1.6.4.tar.gz desde http://www.cairographics.org/releases/
Hay un proyecto de Visual C++ 2005 que podemos usar (mediante apertura y actualización) para 2008.
cairomm-1.6.4\MSCV_Net2005\cairomm\cairomm.vcproj
Cambios que deben realizarse:
Cambiar la configuración activa a "Liberar"
Propiedades de Cairomm-1.0 (con menú contextual)
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
- Mejoramiento:código FPU rápido
C++/Code generation/Floating point model Fast
Haga clic derecho en 'cairomm-1.0' y 'compilar'.Hay algunas advertencias.
dir cairomm-1.6.4\MSVC_Net2005\cairomm\Release # # cairomm-1.0.lib # cairomm-1.0.dll # cairomm.def
Otros consejos
Estos pasos pueden crear el último cairo el 15/11/2015 para la comunidad de Visual Studio 2015.La compilación de depuración es DLL y se vincula a la versión DLL de CRT.La versión de lanzamiento es una biblioteca estática, que se vincula a la versión de enlace estático de CRT y no requiere archivos DLL.
Instalar GnuWin
Los scripts de compilación requieren herramientas de línea de comandos GNU.Los siguientes pasos se prueban con GnuWin de Chocolatey.MSYS también podría funcionar.
Descargar
zlib128.zip, lpng1619.zip, el cairo-1.14.4.tar.xz, pixman-0.32.8.tar.gz
Extracto
Extraiga estos archivos y cambie el nombre de los directorios:
. (my_cairo_build_root)
├─cairo
├─libpng
├─pixman
└─zlib
zlib
No construyas.El script de compilación utiliza MSVCRT que no coincide con Visual Studio 2015.Utilice la biblioteca generada a partir de libpng build.
libpng
Editar libpng\projects\vstudio\zlib.props
:
- en
<ZLibSrcDir>
eliminar el número de versión:..\..\..\..\zlib
- en
<WindowsSDKDesktopARMSupport>
cambiartrue
afalse
Abierto libpng\projects\vstudio\vstudio.sln
en Visual Studio y confirme la actualización.Utilice el valor predeterminado Debug
configuración y haga clic derecho en el proyecto libpng
para construir.Cambiar a Release Library
configuración y clic derecho en proyecto libpng
para construir.
pixman
Editar pixman\Makefile.win32.common
:
- Reemplazar
CFG_CFLAGS = -MD -O2
conCFG_CFLAGS = -MT -O2
(vinculando a la versión de enlace estático de CRT en la versión de lanzamiento) - Reemplazar
@mkdir
con@"mkdir"
(haycmd
está incorporadomkdir
y GnuWinmkdir
, las comillas obligan a utilizar este último)
Ejecute el símbolo del sistema nativo de Visual Studio x86 desde el menú de inicio:
cd /d my_cairo_build_root
cd pixman\pixman
make -f Makefile.win32
make -f Makefile.win32 CFG=debug
El Cairo
Editar cairo\build\Makefile.win32.common
:
- Reemplazar
CFG_CFLAGS = -MD -O2
conCFG_CFLAGS = -MT -O2
- Reemplazar
CAIRO_LIBS += $(LIBPNG_PATH)/libpng.lib
conCAIRO_LIBS += $(LIBPNG_PATH)/lib/$(CFG)/libpng16.lib
.Ahora, copia el directorio.libpng\projects\vstudio\Debug
en (creado)libpng\lib\
y cambiarle el nombre adebug
.Copiar el directoriolibpng\projects\vstudio\Release Library
enlibpng\lib\
y cambiarle el nombre arelease
. - Reemplazar
CAIRO_LIBS += $(ZLIB_PATH)/zdll.lib
conCAIRO_LIBS += $(LIBPNG_PATH)/lib/$(CFG)/zlib.lib
Hay dos
@mkdir -p $(CFG)/`dirname $<`
líneas.Reemplace ambos con:@"mkdir" -p $(CFG)/$< @"rmdir" $(CFG)/$<
Editar cairo\build\Makefile.win32.features-h
:
- Reemplaza todo
@echo
con@"echo"
hay un inservible link.exe
en GnuWin.Rebautizar C:\GnuWin\bin\link.exe
a link_.exe
para evitar enfrentamientos.
Ejecute el símbolo del sistema nativo de Visual Studio x86 desde el menú de inicio:
cd /d my_cairo_build_root
cd cairo
make -f Makefile.win32 CFG=debug
make -f Makefile.win32 CFG=release
Los dos últimos comandos mostrarán "Built successfully!"
pero devuelve error.Ingnóralos.
cambiar el nombre de nuevo C:\GnuWin\bin\link.exe
.
Configurar Visual Studio
Crear un directorio include
y copie los siguientes encabezados en:
cairo\cairo-version.h
(nocairo\src\cairo-version.h
)cairo\src\*.h
, Excluyendocairo\src\cairo-version.h
Agregue ese directorio para incluir la ruta en Visual Studio.
Agregar cairo\src\$(Configuration)
y libpng\lib\$(Configuration)
a la ruta de la biblioteca. $(Configuration)
se expandirá automáticamente a Debug
o Release
al construir.
Poner cairo\src\debug\cairo.dll
y libpng\lib\debug\libpng16.dll
a uno de Windows PATH
.
Antes #include <cairo.h>
, configure las opciones de enlace:
#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
Las instrucciones no parecen funcionar con la versión actual de imlib. Me pregunto si vale la pena volver a hacer esta pregunta.
¿Consultaste aquí? http://cairographics.org/visualstudio/ ?¿Qué quiere decir con "Utiliza el tiempo de ejecución MSCVRT, que es incompatible con Visual C++ 2005/2008"?¿Cuáles son los problemas exactos que estás teniendo?
Me encontré con dos problemas al compilar en Windows (Visual Studio 2008, GNU Make 3.81):
Construcciones "if" no válidas en src/Makefile.sources.Se arregló eso usando
sed "s/^if \([A-Z_]*\)$/ifeq ($(\1), 1)/" src\Makefile.sources
_lround
no está disponible en Windows/MSVC.Se solucionó eso usandosed "s/#define _cairo_lround lround/static inline long cairo_const _cairo_lround(double r) { return (long)floor(r + .5); }/"`
(que probablemente sea una mala solución)
Dejando de lado estos problemas, todo funciona muy bien (tanto para arquitecturas x86 como para x86_64).
He hecho esto, pero no tengo instrucciones escritas.Mis compilaciones también son bastante mínimas ya que no he necesitado soporte para, por ejemplo.Archivos PNG y SVG, solo lo usé para representar gráficos vectoriales generados en búferes de memoria.
Pero lo que hice fue leer el config.h
y otros archivos para el sistema de compilación UNIX/GNU y escribir el mío propio adecuado para MSVC, y luego crear un proyecto con los archivos fuente apropiados.Probablemente, en el mejor de los casos, te llevará unas horas hacer esto, pero cuando hayas terminado, simplemente funcionará;)
Editar:Consulte esta página, tiene un proyecto MSVC 2003 (7.1) para construir el Cairo: http://slinavlee.googlepages.com/
La cadena de herramientas MSYS+gcc utiliza la antigua biblioteca de tiempo de ejecución MSVCRT (ahora integrada en Windows) y Visual C++ 2005/2008 trae la suya propia.Es un hecho conocido ese código no debería depender de múltiples tiempos de ejecución.Pasando cosas s.a.identificadores de archivos, punteros de memoria, etc.se verá afectado y provocará fallos aparentemente aleatorios en tal escenario.
Esto no me ha picado.Por otra parte, tampoco me dirijo a Windows.Pero me han dicho lo suficiente como para ni siquiera probar la solución.
Lo que podría haber funcionado es vincular todas las dependencias estáticamente a la biblioteca (por ejemplo, Cairomm).Las bibliotecas estáticas no tienen un tiempo de ejecución vinculado, ¿verdad?Pero no intenté esto.De hecho, logré que la compilación VC++ de todos los ingredientes funcionara, pero tomó días.
No había encontrado la URL que proporcionas.Extraño en sí mismo;Miré por todas partes'.Por otra parte, es para Visual Studio 2003.NET, por lo que ya hay dos generaciones detrás.