Come compilare Cairo per Visual C++ 2008 (edizione Express)
-
01-07-2019 - |
Domanda
La maggior parte dei binari Windows precompilati sono realizzati con la toolchain MSYS+gcc.Utilizza il runtime MSVCRT, che è incompatibile con Visual C++ 2005/2008.
Quindi, come procedere e compilare Cairo 1.6.4 (o successivo) solo per Visual C++.Comprese le dipendenze (png,zlib,pixman).
Soluzione
Ecco le istruzioni per costruire Cairo/Cairomm con Visual C++.
Necessario:
- Visual C++ 2008 Express SP1 (ora include SDK)
- MSYS 1.0
Per utilizzare gli strumenti da riga di comando VC++, è necessario eseguire un file batch "vcvars32.bat".
C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vcvars32.bat
ZLib
Scarica (ed estrai) zlib123.zip da 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
Scarica (ed estrai) lpng1231.zip da http://www.libpng.org/pub/png/libpng.html
Il compilatore VC++ 9.0 fornisce moltissimi avvisi "potrebbe non essere sicuro".Ignorali;questo è il panico della sicurezza MS (il codice è buono).
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 fa parte del Cairo, ma è un download separato.
Scarica (ed estrai) pixman-0.12.0.tar.gz da http://www.cairographics.org/releases/
Usa MSYS per decomprimere tramite 'tar -xvzf pixman*.tar.gz'
Sia Pixman che Cairo hanno i file di makefiles per il compilatore di comando Visual C ++ (CL), ma usano gli strumenti GNU MakeFile e Unix simili a UNIX (SED ecc.).Ciò significa che dobbiamo eseguire la marca all'interno di MSY.
Apri un prompt dei comandi con gli strumenti da riga di comando VC++ abilitati (prova "cl /?").Trasforma il prompt dei comandi in un prompt MSYS con "C:\MSYS\1.0\MSYS.BAT".
NON utilizzare l'icona MSYS, perché in questo caso il tuo prompt ora riconoscerà VC++.Non è possibile eseguire file .bat da MSYS.
Prova che gli strumenti VC++ funzionano da qui:'cl-?'
Prova che anche Gnu make funzioni:'make -v'.
Freddo.
cd (use /d/... instead of D:) cd pixman-0.12.0/pixman make -f Makefile.win32
Questo impostazione predefinita è per le ottimizzazioni MMX e SSE2, che richiedono un nuovo processore X86 (Pentium 4 o Pentium M o superiore: http://fi.wikipedia.org/wiki/SSE2 )
Ci sono alcuni avvertimenti ma sembra che abbia successo.
ls release # pixman-1.lib (static lib required by Cairo)
Rimani nel prompt MSYS speziato di VC++ affinché anche Cairo venga compilato.
Cairo
Scarica (ed estrai) cairo-1.6.4.tar.gz da http://www.cairographics.org/releases/
cd cd cairo-1.6.4
Il Makefile.win32 qui è quasi buono, ma ha il percorso Pixman cablato.
Utilizza il "Makefile-cairo.win32" modificato:
make -f ../Makefile-cairo.win32 CFG=release \ PIXMAN_PATH=../../pixman-0.12.0 \ LIBPNG_PATH=../../lpng1231 \ ZLIB_PATH=../../zlib123
(Scrivi tutto su una riga, ignorando le barre rovesciate)
Dice "nessuna regola per creare 'src/cairo-features.h'.Usa quello preparato manualmente (al Cairo> 1.6.4 potrebbe esserci un 'SRC/Cairo-Features-win32.h' che puoi semplicemente rinominare):
cp ../cairo-features.h src/
Riprova il comando make (la freccia su lo ricorda).
ls src/release # # cairo-static.lib
Cairomm (API C++)
Scarica (ed estrai) cairomm-1.6.4.tar.gz da http://www.cairographics.org/releases/
Esiste un progetto Visual C++ 2005 che possiamo utilizzare (tramite apertura e aggiornamento) per il 2008.
cairomm-1.6.4\MSCV_Net2005\cairomm\cairomm.vcproj
Modifiche da apportare:
Modifica la configurazione attiva in "Rilascia"
Proprietà Cairomm-1.0 (con il menu contestuale)
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
- Ottimizzazione:codice FPU veloce
C++/Code generation/Floating point model Fast
Fare clic con il tasto destro su "cairomm-1.0" e "build".Ci sono alcuni avvertimenti.
dir cairomm-1.6.4\MSVC_Net2005\cairomm\Release # # cairomm-1.0.lib # cairomm-1.0.dll # cairomm.def
Altri suggerimenti
Questi passaggi possono creare l'ultima versione di Cairo il 15-11-2015 per la community di Visual Studio 2015.La build di debug è DLL, che si collega alla versione DLL di CRT.La build di rilascio è una libreria statica, che si collega alla versione di collegamento statico di CRT e non richiede DLL.
Installa GnuWin
Gli script di compilazione richiedono strumenti da riga di comando GNU.Vengono testati i seguenti passaggi GnuWin di Chocolatey.Anche MSYS potrebbe funzionare.
Scaricamento
zlib128.zip, lpng1619.zip, cairo-1.14.4.tar.xz, pixman-0.32.8.tar.gz
Estratto
Estrai questi archivi e rinomina le directory:
. (my_cairo_build_root)
├─cairo
├─libpng
├─pixman
└─zlib
zlib
Non costruire.Lo script di compilazione utilizza MSVCRT che è in conflitto con Visual Studio 2015.Utilizza la libreria generata dalla build libpng.
libpng
Modificare libpng\projects\vstudio\zlib.props
:
- In
<ZLibSrcDir>
rimuovere il numero di versione:..\..\..\..\zlib
- In
<WindowsSDKDesktopARMSupport>
modificatrue
Afalse
Aprire libpng\projects\vstudio\vstudio.sln
in Visual Studio e confermare l'aggiornamento.Utilizza l'impostazione predefinita Debug
configurazione e fare clic con il pulsante destro del mouse su progetto libpng
costruire.Passa a Release Library
configurazione e fare clic con il pulsante destro del mouse su progetto libpng
costruire.
pixman
Modificare pixman\Makefile.win32.common
:
- Sostituire
CFG_CFLAGS = -MD -O2
conCFG_CFLAGS = -MT -O2
(collegamento alla versione di collegamento statico di CRT nella build di rilascio) - Sostituire
@mkdir
con@"mkdir"
(ci sonocmd
è integratomkdir
e quello di GnuWinmkdir
, le virgolette obbligano a utilizzare quest'ultimo)
Esegui il prompt dei comandi nativo di Visual Studio x86 dal menu Start:
cd /d my_cairo_build_root
cd pixman\pixman
make -f Makefile.win32
make -f Makefile.win32 CFG=debug
Cairo
Modificare cairo\build\Makefile.win32.common
:
- Sostituire
CFG_CFLAGS = -MD -O2
conCFG_CFLAGS = -MT -O2
- Sostituire
CAIRO_LIBS += $(LIBPNG_PATH)/libpng.lib
conCAIRO_LIBS += $(LIBPNG_PATH)/lib/$(CFG)/libpng16.lib
.Ora copia la directorylibpng\projects\vstudio\Debug
in (creato)libpng\lib\
e rinominarlo indebug
.Copia la directorylibpng\projects\vstudio\Release Library
inlibpng\lib\
e rinominarlo inrelease
. - Sostituire
CAIRO_LIBS += $(ZLIB_PATH)/zdll.lib
conCAIRO_LIBS += $(LIBPNG_PATH)/lib/$(CFG)/zlib.lib
Ci sono due
@mkdir -p $(CFG)/`dirname $<`
linee.Sostituiscili entrambi con:@"mkdir" -p $(CFG)/$< @"rmdir" $(CFG)/$<
Modificare cairo\build\Makefile.win32.features-h
:
- Sostituisci tutto
@echo
con@"echo"
C'è un inutilizzabile link.exe
in GnuWin.Rinominare C:\GnuWin\bin\link.exe
A link_.exe
per evitare lo scontro.
Esegui il prompt dei comandi nativo di Visual Studio x86 dal menu Start:
cd /d my_cairo_build_root
cd cairo
make -f Makefile.win32 CFG=debug
make -f Makefile.win32 CFG=release
Verranno visualizzati gli ultimi due comandi "Built successfully!"
ma restituisce errore.Ignorali.
Rinomina indietro C:\GnuWin\bin\link.exe
.
Configura Visual Studio
Crea una directory include
e copia le seguenti intestazioni in:
cairo\cairo-version.h
(noncairo\src\cairo-version.h
)cairo\src\*.h
, esclusocairo\src\cairo-version.h
Aggiungi quella directory per includere il percorso in Visual Studio.
Aggiungere cairo\src\$(Configuration)
E libpng\lib\$(Configuration)
al percorso della biblioteca. $(Configuration)
si espanderà automaticamente in Debug
O Release
durante la costruzione.
Mettere cairo\src\debug\cairo.dll
E libpng\lib\debug\libpng16.dll
a uno di Windows' PATH
.
Prima #include <cairo.h>
, imposta le opzioni di collegamento:
#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
Le istruzioni non sembrano funzionare con la versione attuale di imlib, mi chiedo se valga la pena porre nuovamente questa domanda?
Hai controllato qui: http://cairographics.org/visualstudio/ ?Cosa intendi con "Utilizza il runtime MSCVRT, che è incompatibile con Visual C++ 2005/2008"?Quali sono i problemi esatti che stai riscontrando?
Ho riscontrato due problemi durante la creazione su Windows (Visual Studio 2008, GNU Make 3.81):
Costrutti "if" non validi in src/Makefile.sources.Risolto il problema utilizzando
sed "s/^if \([A-Z_]*\)$/ifeq ($(\1), 1)/" src\Makefile.sources
_lround
non è disponibile su Windows/MSVC.Ho risolto il problema utilizzandosed "s/#define _cairo_lround lround/static inline long cairo_const _cairo_lround(double r) { return (long)floor(r + .5); }/"`
(che probabilmente è una soluzione scadente)
A parte questi problemi, tutto funziona alla grande (sia per le architetture x86 che x86_64).
L'ho fatto, ma non ho istruzioni già scritte.Anche le mie build sono piuttosto minime in quanto non ho bisogno di supporto per es.PNG e SVG, l'ho appena usato per eseguire il rendering della grafica vettoriale generata nei buffer di memoria.
Ma quello che ho fatto è stato leggere il file config.h
e altri file per il sistema di compilazione UNIX/GNU e scrivo il mio adatto per MSVC, quindi creo un progetto con i file sorgente appropriati.Probabilmente ci vorranno al massimo alcune ore per farlo, ma quando hai finito funziona e basta ;)
Modificare:Vedi questa pagina, ha un progetto MSVC 2003 (7.1) per la costruzione del Cairo: http://slinavlee.googlepages.com/
La toolchain MSYS+gcc utilizza la vecchia libreria runtime MSVCRT (ora integrata in Windows) e Visual C++ 2005/2008 ne porta la propria.È un fatto noto quel codice non dovrebbe dipendere da più runtime.Passare le cose s.a.handle di file, puntatori di memoria, ecc.sarà influenzato e causerà arresti anomali apparentemente casuali in tale scenario.
Non sono stato morso da questo.D'altra parte, non mi rivolgo più nemmeno a Windows.Ma mi è stato detto abbastanza per non provare nemmeno la soluzione.
Ciò che avrebbe potuto funzionare è collegare staticamente tutte le dipendenze nella lib (ad esempio Cairomm).Le librerie statiche non hanno un runtime associato, vero?Ma non l'ho provato.In realtà sono riuscito a far funzionare la costruzione VC++ di tutti gli ingredienti, ma ci sono voluti giorni.
Non avevo trovato l'URL che hai fornito.Strano di per sé;Ho guardato "ovunque".D'altra parte, è per Visual Studio 2003.NET, quindi già due generazioni indietro.