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).

Foi útil?

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ça true para false

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 com CFG_CFLAGS = -MT -O2 (vinculando -se à versão estática do CRT na versão de lançamento)
  • Substituir @mkdir com @"mkdir" (existem cmdestá embutido mkdir e Gnuwin's mkdir, 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 com CFG_CFLAGS = -MT -O2
  • Substituir CAIRO_LIBS += $(LIBPNG_PATH)/libpng.lib com CAIRO_LIBS += $(LIBPNG_PATH)/lib/$(CFG)/libpng16.lib. Agora, copie o diretório libpng\projects\vstudio\Debug em (criado) libpng\lib\ e renomear para debug. Copie o diretório libpng\projects\vstudio\Release Library em libpng\lib\ e renomear para release.
  • Substituir CAIRO_LIBS += $(ZLIB_PATH)/zdll.lib com CAIRO_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ão cairo\src\cairo-version.h)
  • cairo\src\*.h, excluindo cairo\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):

  1. Inválido "se" constrói em src/makefile.sources. Corrigido isso usando

    sed "s/^if \([A-Z_]*\)$/ifeq ($(\1), 1)/" src\Makefile.sources
    
  2. _lround não está disponível no Windows/MSVC. Trabalhou em torno disso usando

    sed "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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top