11

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

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

4

7 回答 7

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

    光盘zlib123
    nmake /f win32/Makefile.msc

    目录
        # zlib.lib 是静态库
        #
        # zdll.lib 是 zlib1.dll 的导入库
        # zlib1.dll 是共享库

从http://www.libpng.org/pub/png/libpng.html下载(并提取)lpng1231.zip

VC++ 9.0 编译器会给出大量“这可能不安全”的警告。别理他们; 这是 MS 安全恐慌(代码很好)。

    cd lpng1231\lpng1231 # 出于某种原因,这是两层深

    nmake /f ../../lpng1231.nmake ZLIB_PATH=../zlib123

    目录
        # libpng.lib 是静态库
        #
        # dll 没有被创建

皮克斯曼

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(使用 /d/... 而不是 D:)
    cd pixman-0.12.0/pixman
    make -f Makefile.win32

这默认为 MMX 和 SSE2 优化,这需要新的 x86 处理器(奔腾 4 或奔腾 M 或更高版本:http: //fi.wikipedia.org/wiki/SSE2

有很多警告,但它似乎成功了。

    释放
        # pixman-1.lib(开罗需要的静态库)

留在 VC++ 加香料的 MSYS 提示符下,也可以在 Cairo 进行编译。

开罗

从http://www.cairographics.org/releases/下载(并提取)cairo-1.6.4.tar.gz

    光盘
    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'。使用手动准备的(在Cairo > 1.6.4中可能有一个'src/cairo-features-win32.h',您可以简单地重命名) :

    cp ../cairo-features.h src/

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

    ls src/发布
        #
        # cairo-static.lib

cairomm (C++ API)

从http://www.cairographics.org/releases/下载(并提取)cairomm-1.6.4.tar.gz

有一个 Visual C++ 2005 项目,我们可以在 2008 年使用(通过开放和升级)。

    cairomm-1.6.4\MSCV_Net2005\cairomm\cairomm.vcproj

需要做的改变:

  • 将活动配置更改为“发布”

  • Cairomm-1.0 属性(带有右键菜单)

        C++/General/Additional 包含目录:
            ..\..\..\cairo-1.6.4\src(附加到现有的)

        链接器/常规/其他库目录:
            ..\..\..\cairo-1.6.4\src\release
            ..\..\..\lpng1231\lpng1231
            ..\..\..\zlib123

        链接器/输入/附加依赖项:   
            cairo-static.lib libpng.lib zlib.lib msimg32.lib
  • 优化:快速 FPU 代码
            C++/代码生成/浮点模型
                快速地

右键单击“cairomm-1.0”和“构建”。有一些警告。

    目录 cairomm-1.6.4\MSVC_Net2005\cairomm\Release
        #
        # cairomm-1.0.lib
        # cairomm-1.0.dll
        # cairomm.def
于 2008-09-19T08:58:22.120 回答
4

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

安装 GnuWin

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

下载

zlib128.zip , lpng1619.zip , cairo-1.14.4.tar.xz , pixman-0.32.8.tar.gz

提炼

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

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

zlib

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

编辑libpng\projects\vstudio\zlib.props

  • <ZLibSrcDir>删除版本号:..\..\..\..\zlib
  • <WindowsSDKDesktopARMSupport>改为_ true_false

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

像素人

编辑pixman\Makefile.win32.common

  • 替换CFG_CFLAGS = -MD -O2CFG_CFLAGS = -MT -O2(链接到发布版本中 CRT 的静态链接版本)
  • 替换@mkdir@"mkdir"(有cmd's builtinmkdir和 GnuWin's 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 -O2CFG_CFLAGS = -MT -O2
  • 替换CAIRO_LIBS += $(LIBPNG_PATH)/libpng.libCAIRO_LIBS += $(LIBPNG_PATH)/lib/$(CFG)/libpng16.lib。现在,将目录复制libpng\projects\vstudio\Debug到 (created)libpng\lib\中并将其重命名为debug. 将目录复制libpng\projects\vstudio\Release Librarylibpng\lib\并重命名为release.
  • 替换CAIRO_LIBS += $(ZLIB_PATH)/zdll.libCAIRO_LIBS += $(LIBPNG_PATH)/lib/$(CFG)/zlib.lib
  • 有两条@mkdir -p $(CFG)/`dirname $<`线。将它们都替换为:

    @"mkdir" -p $(CFG)/$<
    @"rmdir" $(CFG)/$<
    

编辑cairo\build\Makefile.win32.features-h

  • 全部替换@echo@"echo"

link.exeGnuWin 中有一个无法使用的问题。重命名C:\GnuWin\bin\link.exelink_.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.dll和放到libpng\lib\debug\libpng16.dllWindows 之一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
于 2015-11-15T09:37:56.153 回答
2

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

于 2010-03-09T22:31:53.087 回答
1

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

于 2008-09-18T09:55:52.037 回答
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); }/"`  
    

    (这可能是一个糟糕的修复)

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

于 2011-07-15T08:02:56.983 回答
0

MSYS+gcc 工具链使用旧的 MSVCRT 运行时库(现在内置于 Windows)和 Visual C++ 2005/2008 自带。众所周知,代码不应依赖于多个运行时传递文件句柄、内存指针等会受到影响,并且在这种情况下会导致明显的随机崩溃。

我没有被这个咬过。再说一次,我也不再以 Windows 为目标。但我被告知甚至不要尝试解决方案。

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

我没有找到你提供的网址。本身就很奇怪;我“到处”看了看。再说一次,它是针对 Visual Studio 2003.NET 的,所以已经落后了两代。

于 2008-09-18T19:41:43.050 回答
0

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

但我所做的是通读config.hUNIX/GNU 构建系统的文件和其他文件,并编写适合 MSVC 的自己的文件,然后使用适当的源文件创建项目。最多可能需要几个小时才能做到这一点,但是当你完成后它就可以工作了;)

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

于 2008-09-18T19:44:00.983 回答