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

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

有帮助吗?

解决方案

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

必需的:

  • Visual C++ 2008 Express SP1(现在包括 SDK)
  • 系统管理系统1.0

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

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

零库

从以下位置下载(并解压)zlib123.zip 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

库文件

从以下位置下载(并解压)lpng1231.zip http://www.libpng.org/pub/png/libpng.html

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

    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 是 Cairo 的一部分,但需要单独下载。

从以下地址下载(并解压)pixman-0.12.0.tar.gz http://www.cairgraphics.org/releases/

使用 MSYS 通过“tar -xvzf pixman*.tar.gz”解压

Pixman和Cairo都有用于Visual C ++命令行编译器(CL)的Makefiles,但它们使用GNU Makefile和Unix样工具(SED等)。这意味着我们必须从MSYS内部运行Make。

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

不要使用 MSYS 图标,因为这样你的提示符就会识别 VC++。您无法从 MSYS 运行 .bat 文件。

尝试从这里开始使用 VC++ 工具:'cl-?'

尝试一下 Gnu make 也可以工作:'制作-v'。

凉爽的。

    cd     (use /d/... instead of D:)
    cd pixman-0.12.0/pixman
    make -f Makefile.win32

这默认为MMX和SSE2优化,该优化需要Newish X86处理器(Pentium 4或Pentium M或更高: http://fi.wikipedia.org/wiki/SSE2 )

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

    ls release
        # pixman-1.lib  (static lib required by Cairo)

留在 VC++ 的 MSYS 提示符下,以便 Cairo 进行编译。

开罗

从以下地址下载(并解压)cairo-1.6.4.tar.gz http://www.cairgraphics.org/releases/

    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

开罗姆 (C++ API)

从以下地址下载(并解压)cairomm-1.6.4.tar.gz http://www.cairgraphics.org/releases/

有一个 Visual C++ 2005 项目,我们可以在 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”和“构建”。有一些警告。

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

其他提示

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

安装 GnuWin

构建脚本需要 GNU 命令行工具。以下步骤经过测试 来自 Chocolatey 的 GnuWin. 。MSYS 也可能有效。

下载

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

提炼

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

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

兹库

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

库文件

编辑 libpng\projects\vstudio\zlib.props:

  • <ZLibSrcDir> 删除版本号: ..\..\..\..\zlib
  • <WindowsSDKDesktopARMSupport> 改变 truefalse

打开 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的内置 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 -O2CFG_CFLAGS = -MT -O2
  • 代替 CAIRO_LIBS += $(LIBPNG_PATH)/libpng.libCAIRO_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.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.exe 在 GnuWin 中。改名 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) 会自动扩展为 Debug 或者 Release 建造时。

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

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

你检查过这里吗: http://cairgraphics.org/visualstudio/ ?“它使用 MSCVRT 运行时,与 Visual C++ 2005/2008 不兼容”是什么意思?您遇到的具体问题是什么?

我在 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 架构)。

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

但我所做的是通读 config.h 以及 UNIX/GNU 构建系统的其他文件,并编写我自己的适合 MSVC 的文件,然后使用适当的源文件创建一个项目。完成此操作最多可能需要几个小时,但是当您完成后,它就会起作用;)

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

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

我没有被这个咬过。话又说回来,我也不再真正以 Windows 为目标了。但我已经被告知不要尝试这个解决方案。

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

我没有找到你提供的网址。本身就很奇怪;我到处寻找。话又说回来,它是针对 Visual Studio 2003.NET 的,所以已经落后了两代。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top