大多数预编译的 Windows 二进制文件都是使用 MSYS+gcc 工具链制作的。它使用与 Visual C++ 2005/2008 不兼容的 MSVCRT 运行时。
那么,如何仅为 Visual C++ 编译 Cairo 1.6.4(或更高版本)。包括依赖项(png、zlib、pixman)。
大多数预编译的 Windows 二进制文件都是使用 MSYS+gcc 工具链制作的。它使用与 Visual C++ 2005/2008 不兼容的 MSVCRT 运行时。
那么,如何仅为 Visual C++ 编译 Cairo 1.6.4(或更高版本)。包括依赖项(png、zlib、pixman)。
以下是使用 Visual C++ 构建 Cairo/Cairomm 的说明。
必需的:
要使用 VC++ 命令行工具,需要运行批处理文件“vcvars32.bat”。
C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vcvars32.bat
从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
从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
C++/代码生成/浮点模型
快速地
右键单击“cairomm-1.0”和“构建”。有一些警告。
目录 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。
构建脚本需要 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
不要建造。构建脚本使用与 Visual Studio 2015 冲突的 MSVCRT。使用从 libpng 构建生成的库。
编辑libpng\projects\vstudio\zlib.props:
<ZLibSrcDir>删除版本号:..\..\..\..\zlib<WindowsSDKDesktopARMSupport>改为_ true_falselibpng\projects\vstudio\vstudio.sln在 Visual Studio 中打开并确认升级。使用默认Debug配置,右击项目libpng进行构建。切换到Release Library配置并右键单击项目libpng进行构建。
编辑pixman\Makefile.win32.common:
CFG_CFLAGS = -MD -O2为CFG_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 -O2为CFG_CFLAGS = -MT -O2CAIRO_LIBS += $(LIBPNG_PATH)/libpng.lib为CAIRO_LIBS += $(LIBPNG_PATH)/lib/$(CFG)/libpng16.lib。现在,将目录复制libpng\projects\vstudio\Debug到 (created)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"link.exeGnuWin 中有一个无法使用的问题。重命名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。
创建一个目录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.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
这些说明似乎不适用于当前版本的 imlib,我想知道是否值得重新提出这个问题?
您是否在这里查看过:http: //cairographics.org/visualstudio/?'它使用与 Visual C++ 2005/2008 不兼容的 MSCVRT 运行时'是什么意思?您遇到的具体问题是什么?
在 Windows 上构建时遇到了两个问题(Visual Studio 2008,GNU Make 3.81):
src/Makefile.sources 中的“if”结构无效。修复了使用
sed "s/^if \([A-Z_]*\)$/ifeq ($(\1), 1)/" src\Makefile.sources
_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 架构)。
MSYS+gcc 工具链使用旧的 MSVCRT 运行时库(现在内置于 Windows)和 Visual C++ 2005/2008 自带。众所周知,代码不应依赖于多个运行时。传递文件句柄、内存指针等会受到影响,并且在这种情况下会导致明显的随机崩溃。
我没有被这个咬过。再说一次,我也不再以 Windows 为目标。但我被告知甚至不要尝试解决方案。
本来可行的是将所有依赖项静态链接到库中(例如,Cairomm)。静态库没有绑定到它们的运行时,是吗?但我没有尝试这个。我实际上让所有成分的 VC++ 构建工作,但花了几天时间。
我没有找到你提供的网址。本身就很奇怪;我“到处”看了看。再说一次,它是针对 Visual Studio 2003.NET 的,所以已经落后了两代。
我已经这样做了,但是我没有任何现成的说明。我的构建也相当少,因为我不需要支持例如。PNG 和 SVG 文件,我只是用它来将生成的矢量图形渲染到内存缓冲区。
但我所做的是通读config.hUNIX/GNU 构建系统的文件和其他文件,并编写适合 MSVC 的自己的文件,然后使用适当的源文件创建项目。最多可能需要几个小时才能做到这一点,但是当你完成后它就可以工作了;)
编辑:请查看此页面,它有一个用于构建 cairo 的 MSVC 2003 (7.1) 项目:http: //slinavlee.googlepages.com/