如何编译Cairo for Visual C ++ 2008(Express版)

时间:2008-09-17 17:29:47

标签: visual-studio-2008 visual-c++ open-source graphics

大多数预编译的Windows二进制文件都是使用MSYS + gcc工具链制作的。它使用MSVCRT运行时,它与Visual C ++ 2005/2008不兼容。

那么,如何仅针对Visual C ++编译和编译Cairo 1.6.4(或更高版本)。包括依赖项(png,zlib,pixman)。

7 个答案:

答案 0 :(得分:18)

以下是使用Visual C ++构建Cairo / Cairomm的说明。

必需:

  • Visual C ++ 2008 Express SP1(现在包含SDK)
  • MSYS 1.0

要使用VC ++命令行工具,需要运行批处理文件“vcvars32.bat”。

    C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vcvars32.bat

的ZLib

http://www.zlib.net/

下载(并摘录)zlib123.zip
    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

http://www.libpng.org/pub/png/libpng.html

下载(并摘录)lpng1231.zip

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

Pixman是Cairo的一部分,但是单独下载。

http://www.cairographics.org/releases/

下载(并提取)pixman-0.12.0.tar.gz

使用MSYS通过'tar -xvzf pixman * .tar.gz'

解压缩

Pixman和Cairo都有用于Visual C ++命令行编译器(cl)的Makefile, 但他们使用Gnu makefile和类Unix工具(sed等)。这意味着我们拥有 从MSYS中运行make。

在启用VC ++命令行工具的情况下打开命令提示符(尝试'cl /?')。 通过'C:\ MSYS \ 1.0 \ MSYS.BAT'将该命令提示符转换为MSYS提示符。

请勿使用MSYS图标,因为您的提示现在将知道VC ++。 您无法从MSYS运行.bat文件。

尝试使用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)

继续参加VC ++ spiced MSYS提示,以便Cairo进行编译。

开罗

http://www.cairographics.org/releases/

下载(并摘录)cairo-1.6.4.tar.gz
    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'。使用手动准备的 (在开罗> 1.6.4中可能有'src / cairo-features-win32.h',你可以 只需重命名):

    cp ../cairo-features.h src/

重试make命令(向上箭头记住它)。

    ls src/release
        #
        # cairo-static.lib

cairomm(C ++ API)

http://www.cairographics.org/releases/

下载(并摘录)cairomm-1.6.4.tar.gz

我们可以使用Visual C ++ 2005项目(通过open& upgrade)进行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'和'build'。有一些警告。

    dir cairomm-1.6.4\MSVC_Net2005\cairomm\Release
        #
        # cairomm-1.0.lib
        # cairomm-1.0.dll
        # cairomm.def

答案 1 :(得分:3)

这些步骤可以在2015-11-15为Visual Studio 2015社区构建最新的cairo。调试版本是DLL,链接到CRT的DLL版本。发布版本是静态库,链接到CRT的静态链接版本,不需要任何DLL。

安装GnuWin

构建脚本需要GNU命令行工具。使用GnuWin from Chocolatey测试以下步骤。 MSYS也可以工作。

下载

zlib128.ziplpng1619.zipcairo-1.14.4.tar.xzpixman-0.32.8.tar.gz

提取

提取这些档案并重命名目录:

. (my_cairo_build_root)
├─cairo
├─libpng
├─pixman
└─zlib

的zlib

不要建造。构建脚本使用与Visual Studio 2015冲突的MSVCRT。使用libpng build中生成的lib。

的libpng

修改libpng\projects\vstudio\zlib.props

  • <ZLibSrcDir>中移除版本号:..\..\..\..\zlib
  • <WindowsSDKDesktopARMSupport>中将true更改为false

在Visual Studio中打开libpng\projects\vstudio\vstudio.sln并确认升级。使用默认的Debug配置,然后右键单击项目libpng进行构建。切换到Release Library配置并右键单击项目libpng进行构建。

pixman

修改pixman\Makefile.win32.common

  • CFG_CFLAGS = -MD -O2替换为CFG_CFLAGS = -MT -O2(在发布版本中链接到CRT的静态链接版本)
  • @mkdir替换为@"mkdir"cmd的内置mkdir和GnuWin的mkdir,引号强制后者使用)

从开始菜单运行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)会自动扩展为DebugRelease

cairo\src\debug\cairo.dlllibpng\lib\debug\libpng16.dll放入Windows PATH之一。

#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

答案 2 :(得分:2)

这些说明似乎不适用于当前版本的imlib,我想知道是否值得重新提出这个问题?

答案 3 :(得分:1)

你在这里查看:http://cairographics.org/visualstudio/?你是什​​么意思'它使用MSCVRT运行时,它与Visual C ++ 2005/2008不兼容'?你遇到的确切问题是什么?

答案 4 :(得分:1)

在Windows上构建时遇到了两个问题(Visual Studio 2008,GNU Make 3.81):

  1. src / Makefile.sources中的“if”构造无效。修正了使用

    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); }/"`  
    

    (这可能是一个糟糕的解决办法)

  3. 除了这些问题之外,一切都很好(对于x86和x86_64架构)。

答案 5 :(得分:0)

MSYS + gcc工具链使用旧的MSVCRT运行时库(现在内置到Windows中)和Visual C ++ 2005/2008自带。它是一个known fact,代码不应该依赖于多个运行时。传递东西s.a.文件句柄,内存指针等都会受到影响,在这种情况下会导致明显的随机崩溃。

我没有受到这种打击。然后,我再也没有真正针对Windows。但我被告知甚至没有尝试解决方案。

可行的方法是将所有依赖项静态链接到lib(例如,Cairomm)。静态库没有绑定到它们的运行时,是吗?但我没试过这个。我实际上得到了所有成分的VC ++构建工作,但需要几天时间。

我没有找到您提供的网址。本身很奇怪;我看上去“无处不在”。再说一遍,它适用于Visual Studio 2003.NET,已经落后两代了。

答案 6 :(得分:0)

我已经这样做了,但我没有任何现成的指示。我的构建也相当小,因为我不需要支持例如。 PNG和SVG文件,我只是用它来生成生成的矢量图形到内存缓冲区。

但我所做的是通过config.h和UNIX / GNU构建系统的其他文件读取并编写我自己适合MSVC的文件,然后用适当的源文件创建一个项目。这样做可能需要花费几个小时,但是当你完成它只是工作;)

编辑:看到这个页面,它有一个用于构建cairo的MSVC 2003(7.1)项目:http://slinavlee.googlepages.com/