如何为 Visual C++ 2008(Express 版)编译 Cairo
-
01-07-2019 - |
题
大多数预编译的 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>
改变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
的内置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"
有一个不能用的 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
.
配置 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.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://cairgraphics.org/visualstudio/ ?“它使用 MSCVRT 运行时,与 Visual C++ 2005/2008 不兼容”是什么意思?您遇到的具体问题是什么?
我在 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 架构)。
我已经这样做了,但我没有任何现成的说明。我的构建也相当小,因为我不需要支持,例如。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 的,所以已经落后了两代。