大多数预编译的 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
_false
libpng\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 -O2
CAIRO_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.exe
GnuWin 中有一个无法使用的问题。重命名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.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: //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.h
UNIX/GNU 构建系统的文件和其他文件,并编写适合 MSVC 的自己的文件,然后使用适当的源文件创建项目。最多可能需要几个小时才能做到这一点,但是当你完成后它就可以工作了;)
编辑:请查看此页面,它有一个用于构建 cairo 的 MSVC 2003 (7.1) 项目:http: //slinavlee.googlepages.com/