Windows上编译PHP的MagickWand扩展

首先这是一个漫长的过程,尝试编译此插件的用户一定要有耐心。大致流程可以划分为:

  1. 编译ImageMagick
  2. 编译MagickWand

关于PHP的版本。Windows的PHP是用哪个版本的VC编译的,这个一定要先弄清楚,例如我的是VC9编译的,那么一定要下载对应的VC来编译。例如VC9对应VS2008,VC10对应VS2010。

下面切入正题:

  1. 首先下载PHP的源代码,注意你下载的源代码也要跟你Windows上的PHP可执行文件是同一个版本。例如我的是5.4.31RC1。
  2. 下载ImageMagick的源代码,我写这篇文章的时候最新版是ImageMagick-6.8.9
  3. 下载MagickWandforPHP的源代码,我写这篇文章的时候最新版是MagickWandForPHP-1.0.9-2.zip
    (注:以上源代码建议都从官方下载,并且如果有对应的windows版本的,都下载windows版本的。如果没有明显标记windows版本的,那么.zip格式的压缩包通常就默认是windows版本的源代码。)
  4. 首先编译 MagickWand
    MagickWand的源代码目录下有一个叫做VisualMagick的目录,这里面存放了VS的工程文件。双击,升级到你所用的VS版本的解决方案,然后打开。
    第一次编译,难免会遇到错误,如果最后编译有5个或者5个以上的项目失败了,那就一定要检查,然后修改错误以后重新编译。
    我第一次编译的时候有5个项目没有编译成功,导致一些CORE开头的lib文件没能生成。正确的情况下, 应该是每一个子工程都有一个lib文件和对应的dll文件生成的。其中CORE开头的工程尤为重要。如果最后有一个IM_MOD开头的工程没有成功,那可能对后面的影响不大,可以忽略。

    一般来收,工程文件没有编译成功,可能是互相关联的,例如工程A的编译,可能需要工程B的编译出来的lib文件作为支持。我第一次编译的时候,失败原因最后发现是其中一个和多语言功能有关的模块的源文件,里面有各国语言文字,但是这个源文件编码是不带BOM的UTF8,根据微软官方的解释,在VS里面使用这种UTF8的错误是不可预知的,用MadEdit加上了BOM,问题解决,最后只剩下一个MOD工程没有编译成功,可以忽略了。

  5. 然后编译MagickWand
    首先新建一个解决方案,选择win32的dll工程(空项目),然后导入MagickWand下的对应的c文件和h文件。

    加入对应的包含文件目录:
    PHP源码所在目录
    PHP源码所在目录下的Zend目录
    PHP源码所在目录下的main目录
    PHP源码所在目录下的TSRM目录
    ImageMagick源码所在目录
    ImageMagick源码所在目录下的magick目录

    加入对应的库文件目录:
    PHP可执行文件所在目录
    PHP可执行文件所在目录下的extras目录
    PHP可执行文件所在目录下的dev目录
    ImageMagick源码所在目录下的VisualMagick\Lib目录

    进入工程文件的属性,展开 C/C++ > 预处理器 栏目,在预处理器定义中加入如下内容:
    ZEND_DEBUG=0
    WIN32
    NDEBUG
    _WINDOWS
    _USRDLL
    MAGICKWAND_EXPORTS
    COMPILE_DL_MAGICKWAND
    ZEND_WIN32
    PHP_WIN32
    HAVE_MAGICKWAND=1
    LIBZEND_EXPORTS

    进入 连接器 > 输入 栏目,在附加依赖项中加入如下内容:
    odbc32.lib
    odbccp32.lib
    php5embed.lib
    CORE_RL_wand_.lib
    CORE_RL_zlib_.lib
    CORE_RL_webp_.lib
    CORE_RL_ttf_.lib
    CORE_RL_tiff_.lib
    CORE_RL_png_.lib
    CORE_RL_pixman_.lib
    CORE_RL_openjpeg_.lib
    CORE_RL_Magick++_.lib
    CORE_RL_magick_.lib
    CORE_RL_lqr_.lib
    CORE_RL_libxml_.lib
    CORE_RL_lcms_.lib
    CORE_RL_jpeg_.lib
    CORE_RL_jp2_.lib
    CORE_RL_jbig_.lib
    CORE_RL_glib_.lib
    CORE_RL_ffi_.lib
    CORE_RL_croco_.lib
    CORE_RL_cairo_.lib
    CORE_RL_bzlib_.lib.
    CORE_RL_librsvg_.lib

    此时就可以开始生成解决方案了,中间肯定会遇上错误,大概是C++的一个编译器的断点,找到对应源代码注释掉。(MagickWand for Windows万年不更新代码了,只有根据错误去一个个调整,如果遇上其他错误,解决方案也类似)

  6. 最后生成的dll文件就是标注PHP的扩展文件了,如何使用不再赘述。最后有几点要说明的:

    首先是这个方法默认都是动态链接,所以最后可能需要在我们的环境变量中加入ImageMagick源码所在目录下的VisualMagick\Bin目录,也就是ImageMagick编译出来的那些Dll所在的目录,才能正确加载这个PHP扩展,当然用户在编译的时候也可以选择全静态连接。

    其次是,下载的PHP源码里,很有可能有一处宏定义:#define PHP_COMPILER_ID "VC9",如果遇上了这种情况,改成你自己的编译器版本即可,否则最后加载的时候可能会提示版本无法对接。

    最后,一定要用NTS,也就是非线程安全编译,一般来说Windows的PHP一定要用非线程安全版本。

Windows上编译PHP的MagickWand扩展

时间: 2024-10-05 03:36:41

Windows上编译PHP的MagickWand扩展的相关文章

windows上编译 python C源码

跟随<python源码剖析>一书,了解python内部机制.今天搞定了在windows上编译python源代码. 按照书中的内容,使用VS2008编译Python2.7.9.相似的步骤见下面的链接: http://www.cnblogs.com/heshizhu/archive/2012/08/09/2630346.html 我使用的是VS2008ProEdition90天的试用版,中间遇到一些问题记录一下: 无法打开文件python27.lib 原因及解决方案:系统是win8 64位,没有安

[ZZ] 在windows上编译Mesa3d opengl32库

在windows上编译Mesa3d opengl32库 cheungmine http://blog.csdn.net/ubuntu64fan/article/details/8061475 Mesa3d是一套跨平台的opengl/es库, 它不提供编译好的二进制包,所以必须自己动手编译. Linux默认都带了这个软件, 因此Linux上直接用就可以了. 如果想在linux上的编译, 也比较简单, 本文不赘述.那么如何在Windows上编译这个库呢? Mesa3d官网给出了编译方法. http:

在Mac/Linux/Windows上编译corefx遇到的问题及解决方法

这两天尝试在Mac/Linux/Windows三大平台上编译.NET跨平台三驾马车(coreclr/corefx/dnx)之一的corefx(.NET Core Framework),结果三个平台的编译都失败了.后来一一都解决了,在这篇博文中分享一下. (一) 在Mac上编译corefx遇到的错误如下: /git/dotnet/corefx/dir.props(214,5): warning : The Roslyn targets do not exist- Roslyn will not b

Windows上编译GRPC

Windows上源码编译多数开源软件都很麻烦 编译环境:VS2015(grpc支持2013及以上,2012上没有Nuget,编译起来要费劲的多) 编译GRPC涉及内容 grpc protobuf grpc_protoc_plugin(本文以c++语言为编译目标,因此只涉及grpc_cpp_plugin) zlib grpc代码下载后,执行git submodule update --init初始化依赖的submodule 1. protobuf 参考readme用CMAKE生成工程文件,编译即可

在windows上编译MatConvNet

有个BT的要求,在windows上使用MatConvNet,并且需要支持GPU. 费了些力气,记录一下过程(暂不支持vl_imreadjpeg函数) 在这里下载MatConvNet,机器预装vs2010,Matlab2014a,CUDA6.5. 进入Matlab,切换到{matconvnet_root}: mex -c -largeArrayDims -lmwblas "matlab/src/bits/im2col.cpp" mex -c -largeArrayDims -lmwbla

如何在Windows上编译wireshark源码

在深受了几天编译wireshark源码的痛苦后,记录下自己编译wireshark的经验,希望能给今后需要编译wireshark的人一些帮助.这个方法是能编译最新的wireshark源码,现在网上找的一些方法都是旧的一些方法,编译最新的wireshark是行不通的.我参考的是一个英文的说明文档,如果阅读此文档的人没有困难的话,可以就此英文文档说明进行编译.附上地址:https://www.wireshark.org/docs/wsdg_html_chunked/ChSetupWin32.html

在Windows上编译和调试CoreCLR

生成CoreCLR - Windows篇 本文的唯一目的就是让你运行Hello World 运行环境 Window 7+ Visual studio 2015 确保C++ 工具已经被安装,默认是不安装的,所以要选择自定义模式,VS 2015 精简版不支持. CMake 下载 CMake for windows,并把Cmake的目录添加到为PATH的系统变量里. Python 下载Python for windows 并安装,并把Python的目录地址添加到Path系统变量中. Powershel

hadoop入门-在windows上编译x64位hadoop

环境 Windows 7 x64位,visual studio 2010 professional hadoop 源码版本2.2.0 步骤(来源于书<Pro Apache Hadoop, Second Edition>略作修改. Ensure that JDK 1.6 is or higher is installed. We assume that it is installed in the c:/MyApps/jdkl6/ folder, which should have a bin

如何在windows上编译Chromium (CEF3) 并加入MP3支持(二)

时隔一年,再次编译cef3,独一无二的目的仍为加入mp3支持.新版本的编译环境和注意事项都已经发生了变化,于是再记录一下. 一.编译版本 cef版本号格式为X.YYYY.A.gHHHHHHH X为主版本号,当前只有3 YYYY为chromium分支号 A为递增的svn提交版本号 HHHHHHH为7位git提交hash 此次编译cef版本为3.2704.1434.gec3e9ed 二.编译条件 快速稳定的VPN,下载chromium源码必需,推荐nydus 60G磁盘空间 64位操作系统,Win