Como compilar o Cairo para o Visual C ++ 2008 (Express Edition)
-
01-07-2019 - |
Pergunta
A maioria dos binários do Windows pré -compilada é feita com a cadeia de ferramentas MSYS+GCC. Ele usa o tempo de execução do MSVCRT, que é incompatível com o Visual C ++ 2005/2008.
Portanto, como fazer e compilar o Cairo 1.6.4 (ou posterior) apenas para C ++ visual. Incluindo dependências (PNG, Zlib, Pixman).
Solução
Aqui estão as instruções para a construção do Cairo/Cairomm com C ++ visual.
Requeridos:
- Visual C ++ 2008 Express SP1 (agora inclui SDK)
- MSYS 1.0
Para usar as ferramentas de linha de comando VC ++, um arquivo em lote 'vcvars32.bat' precisa ser executado.
C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vcvars32.bat
Zlib
Download (e extrair) 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
Download (e extrair) lpng1231.zip de http://www.libpng.org/pub/png/libpng.html
O compilador VC ++ 9.0 fornece muitos avisos "Isso pode ser inseguro". Ignore-os; Este é o pânico de segurança do MS (o código é bom).
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 faz parte do Cairo, mas um download separado.
Download (e extrair) Pixman-0.12.0.tar.gz de http://www.cairographics.org/releases/
Use MSYs para Untar via 'Tar -xvzf Pixman*.tar.gz'
Tanto o Pixman quanto o Cairo têm arquivos para o Visual C ++ Command Line Compiler (CL), mas usam ferramentas GNU Makefile e UNIX (sed etc.). Isso significa que temos que executar a marca de dentro do MSYS.
Abra um prompt de comando com as ferramentas de linha de comando vc ++ ativadas (tente 'cl /?'). Transforme esse prompt de comando em um prompt de msys por 'c: msys 1.0 msys.bat'.
Não use o ícone do MSYS, porque agora seu prompt saberá do VC ++. Você não pode executar arquivos .bat a partir de msys.
Experimente que as ferramentas VC ++ funcionam a partir daqui: 'Cl -?'
Experimente que o GNU faça também funciona: 'Make -v'.
Legal.
cd (use /d/... instead of D:) cd pixman-0.12.0/pixman make -f Makefile.win32
Isso padroniza as otimizações MMX e SSE2, que exigem um novo processador X86 (Pentium 4 ou Pentium m ou acima: http://fi.wikipedia.org/wiki/Sse2 )
Há alguns avisos, mas parece ter sucesso.
ls release # pixman-1.lib (static lib required by Cairo)
Mantenha -se no prompt de MSYs com especiarias em VC ++ para que o Cairo compile.
Cairo
Download (e extrair) Cairo-1.6.4.tar.gz de http://www.cairographics.org/releases/
cd cd cairo-1.6.4
O makefile.win32 aqui é quase bom, mas tem o caminho do Pixman.
Use o 'makefile-cairo.win32' modificado:
make -f ../Makefile-cairo.win32 CFG=release \ PIXMAN_PATH=../../pixman-0.12.0 \ LIBPNG_PATH=../../lpng1231 \ ZLIB_PATH=../../zlib123
(Escreva tudo em uma linha, ignorando as barris)
Ele diz "nenhuma regra para fazer 'src/cairo-fumas.h'. Use o preparado manualmente (no Cairo> 1.6.4 pode haver um 'src/cairo-fumante-win32.h' que você pode simplesmente renomear) :
cp ../cairo-features.h src/
Represente o comando make (seta se lembra).
ls src/release # # cairo-static.lib
Cairomm (API C ++)
Download (e extrair) Cairomm-1.6.4.tar.gz de http://www.cairographics.org/releases/
Existe um projeto visual C ++ 2005 que podemos usar (via Open & Upgrade) para 2008.
cairomm-1.6.4\MSCV_Net2005\cairomm\cairomm.vcproj
Mudanças que precisam ser feitas:
Altere a configuração ativa para "liberação"
Propriedades do Cairomm-1.0 (com o menu de clique com o botão direito do lado de botão)
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
- Otimização: código FPU rápido
C++/Code generation/Floating point model Fast
Clique com o botão direito do mouse em 'Cairomm-1.0' e 'Build'. Existem alguns avisos.
dir cairomm-1.6.4\MSVC_Net2005\cairomm\Release # # cairomm-1.0.lib # cairomm-1.0.dll # cairomm.def
Outras dicas
Essas etapas podem construir o mais recente Cairo em 2015-11-15 para a comunidade Visual Studio 2015. A construção de depuração é DLL, vinculando -se à versão DLL do CRT. A construção de liberação é a biblioteca estática, vinculando -se à versão estática do CRT e não exigindo DLLs.
Instale o gnuwin
Os scripts de construção exigem ferramentas de linha de comando GNU. As etapas a seguir são testadas com Gnuwin de Chocolatey. Os MSYs também podem funcionar.
Download
zlib128.zip, LPNG1619.zip, Cairo-1.14.4.tar.xz, Pixman-0.32.8.tar.gz
Extrair
Extraia esses arquivos e renomeie os diretórios:
. (my_cairo_build_root)
├─cairo
├─libpng
├─pixman
└─zlib
zlib
Não construa. O script de construção usa o MSVCRT que se chocam com o Visual Studio 2015. Use a libra gerada da libpng Build.
libpng
Editar libpng\projects\vstudio\zlib.props
:
- dentro
<ZLibSrcDir>
Remova o número da versão:..\..\..\..\zlib
- dentro
<WindowsSDKDesktopARMSupport>
mudançatrue
parafalse
Abrir libpng\projects\vstudio\vstudio.sln
no Visual Studio e confirme a atualização. Use o padrão Debug
Configuração e projeto de clique com o botão direito libpng
construir. Troque para Release Library
Projeto de configuração e clique com o botão direito libpng
construir.
Pixman
Editar pixman\Makefile.win32.common
:
- Substituir
CFG_CFLAGS = -MD -O2
comCFG_CFLAGS = -MT -O2
(vinculando -se à versão estática do CRT na versão de lançamento) - Substituir
@mkdir
com@"mkdir"
(existemcmd
está embutidomkdir
e Gnuwin'smkdir
, as citações forçam a última a ser usada)
Execute o prompt de comando nativo do Visual Studio X86 no menu Iniciar:
cd /d my_cairo_build_root
cd pixman\pixman
make -f Makefile.win32
make -f Makefile.win32 CFG=debug
Cairo
Editar cairo\build\Makefile.win32.common
:
- Substituir
CFG_CFLAGS = -MD -O2
comCFG_CFLAGS = -MT -O2
- Substituir
CAIRO_LIBS += $(LIBPNG_PATH)/libpng.lib
comCAIRO_LIBS += $(LIBPNG_PATH)/lib/$(CFG)/libpng16.lib
. Agora, copie o diretóriolibpng\projects\vstudio\Debug
em (criado)libpng\lib\
e renomear paradebug
. Copie o diretóriolibpng\projects\vstudio\Release Library
emlibpng\lib\
e renomear pararelease
. - Substituir
CAIRO_LIBS += $(ZLIB_PATH)/zdll.lib
comCAIRO_LIBS += $(LIBPNG_PATH)/lib/$(CFG)/zlib.lib
Existem dois
@mkdir -p $(CFG)/`dirname $<`
linhas. Substitua os dois por:@"mkdir" -p $(CFG)/$< @"rmdir" $(CFG)/$<
Editar cairo\build\Makefile.win32.features-h
:
- Substitua tudo
@echo
com@"echo"
Há um inutilizável link.exe
em gnuwin. Renomear C:\GnuWin\bin\link.exe
para link_.exe
Para evitar o conflito.
Execute o prompt de comando nativo do Visual Studio X86 no menu Iniciar:
cd /d my_cairo_build_root
cd cairo
make -f Makefile.win32 CFG=debug
make -f Makefile.win32 CFG=release
Os dois últimos comando mostrarão "Built successfully!"
mas erro de retorno. Ignore-os.
Renomeie de volta C:\GnuWin\bin\link.exe
.
Configure o Visual Studio
Criar um diretório include
e copie os seguintes cabeçalhos em:
cairo\cairo-version.h
(nãocairo\src\cairo-version.h
)cairo\src\*.h
, excluindocairo\src\cairo-version.h
Adicione esse diretório para incluir o caminho no Visual Studio.
Adicionar cairo\src\$(Configuration)
e libpng\lib\$(Configuration)
para o caminho da biblioteca. $(Configuration)
irá expandir automaticamente para Debug
ou Release
Ao construir.
Colocar cairo\src\debug\cairo.dll
e libpng\lib\debug\libpng16.dll
para um dos Windows ' PATH
.
Antes da #include <cairo.h>
, configure as opções de link:
#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
As instruções não parecem funcionar com a versão atual do Imlib, eu me pergunto se vale a pena reavaliar essa pergunta?
Você verificou aqui: http://cairographics.org/visualstudio/ ? O que você quer dizer com 'ele usa o tempo de execução do MSCVRT, que é incompatível com o Visual C ++ 2005/2008'? Quais são os problemas exatos que você está tendo?
Eu encontrei dois problemas ao construir no Windows (Visual Studio 2008, GNU Make 3.81):
Inválido "se" constrói em src/makefile.sources. Corrigido isso usando
sed "s/^if \([A-Z_]*\)$/ifeq ($(\1), 1)/" src\Makefile.sources
_lround
não está disponível no Windows/MSVC. Trabalhou em torno disso usandosed "s/#define _cairo_lround lround/static inline long cairo_const _cairo_lround(double r) { return (long)floor(r + .5); }/"`
(o que provavelmente é uma correção ruim)
Além disso, tudo funciona muito bem (para arquiteturas x86 e x86_64).
Eu fiz isso, mas não tenho instruções prontas para escritos. Minhas construções também são mínimas, pois não precisei de suporte para por exemplo. Arquivos PNG e SVG, acabei de usar para renderizar gráficos vetoriais gerados aos buffers de memória.
Mas o que eu fiz foi ler o config.h
e outros arquivos para o sistema UNIX/GNU Build e escreva meu próprio adequado para o MSVC e, em seguida, crie um projeto com os arquivos de origem apropriados. Provavelmente leva algumas horas, na melhor das hipóteses, mas quando terminar, apenas funciona;)
EDIT: Veja esta página, possui um projeto MSVC 2003 (7.1) para a construção do Cairo: http://slinavlee.googlepages.com/
O MSYS+GCC Toolchain usa a antiga biblioteca de tempo de execução do MSVCRT (agora incorporada ao Windows) e Visual C ++ 2005/2008 trazem os seus. É um fato conhecido Esse código não deve depender de vários tempos de execução. Passar as coisas de arquivos SA, ponteiros de memória etc. serão afetados e causarão falhas aparentemente aleatórias nesse cenário.
Eu não fui acionado por isso. Então, novamente, também não me alvo mais do Windows. Mas me disseram o suficiente para nem tentar a solução.
O que poderia ter funcionado é vincular todas as dependências estaticamente à lib (digamos, Cairomm). As bibliotecas estáticas não têm um tempo de execução para eles, não é? Mas eu não tentei isso. Na verdade, eu tenho o edifício VC ++ de todos os ingredientes para funcionar, mas levou dias.
Eu não tinha encontrado o URL que você dá. Estranho por si só; Eu olhei 'em todos os lugares'. Por outro lado, é para o Visual Studio 2003.net, então duas gerações já atrasadas.