• 转 解决在X64 RedHat5.1 下以编译方式安装PHP 出现的种种问题


    不知道大家有没有遇到在  X64 RedHat5 或者 RedHat4 下.编译安装PHP环境的时候. 安装了libxml,zlib,jpeg,libpng,freetype,libart_lgpl,gettext...  到编译 GD 库的时候出错.

    configure 的参数是

    ./configure --prefix=/usr/local/gd2 --with-zlib=/usr/local/zlib2/ --with-png=/usr/local/libpng2/ --with-jpeg=/usr/local/jpeg6/ --with-freetype=/usr/local/freetype2/ --with-libart=/usr/local/libart/ --with-gettext=/usr/local/gettext/ --with-libxml=/usr/local/libxml2
    ---------------------------

    错误如下:

    /usr/bin/ld: /usr/local/jpeg6//lib/libjpeg.a(jcapimin.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
    /usr/local/jpeg6//lib/libjpeg.a: could not read symbols: Bad value
    collect2: ld returned 1 exit status
    make[2]: *** [libgd.la] 错误1
    make[2]: Leaving directory `/data/soft/php/gd-2.0.35'
    make[1]: *** [all-recursive] 错误1
    make[1]: Leaving directory `/data/soft/php/gd-2.0.35'
    make: *** [all] 错误2

    到网上搜索,很多网友都说只需要修改 Makefile

    vi Makefile
    找到 CFLAGS= -O2 -I$(srcdir) 
    在后面加入-fPIC,即变成CFLAGS= -O2 -I$(srcdir) -fPIC

    这样就可以继续编译了
    但我在 gd-2.0.35  gd-2.0.33 以及 gd-2.0.36RC1 的 Makefile 里头,
    都只找到 CFLAGS= -O2 并没有后边的 -I$(srcdir) 
    故此就算把-fPIC加上了,也毫无作用。
    ------------------------------------

    开始着手研究,根据错误提示,应该是跟 jpeg6 有关,于是尝试使用另外方式对 jpeg6 进行编译。

    原本网上最多的编译 jpeg6 的方法是 (注jpeg6下载地址http://www.ijg.org/)

    -----------------------------
    # tar -zxf jpegsrc.v6b.tar.gz 
    # cd jpeg-6b/ 
    # ./configure --prefix=/usr/local/jpeg6 
    # make 
    # make install-lib
    # make install 
    在32位上以这种方式安装是没问题的.但64的话,或许要改一改,如下:
    -----------------------------
    # tar -zxf jpegsrc.v6b.tar.gz 
    # cd jpeg-6b/ 
    # ./configure --prefix=/usr/local/jpeg6/ --enable-shared --enable-static 
    # make 
    # make install 
    ----------------------------

    但又会出个问题! 大多数环境在用这种方式编译jpeg6的时候都会出错(有够烦的,简直是一波三折),提示
    make: ./libtool: Command not found 
    make: *** [jcapimin.lo] Error 127 
    ---------------------------

    错误分析:由于libtool版本过低导致的,重新下载新版本的libtool以默认方式安装.下载地址:ftp://ftp.gnu.org/gnu/libtool/
    也不用下载太新,1.5.xx 既可。执行以下命令: 
    # tar zxvf libtool-1.5.26.tar.gz
    # cd libtool-1.5.26
    # ./configure 
    # make 
    # make install 
    (最好重新启动一下服务器,重新加载环境以确保正常)
    然后进入jpeg-6b的源码目录,然后执行以下步骤,切记! 
    # cp /usr/local/share/libtool/config.sub ./
    # cp /usr/local/share/libtool/config.guess ./
    # ./configure --prefix=/usr/local/jpeg6/ --enable-shared --enable-static 
    # make 
    # make install

    ---------------------------

    好了!这下尝试执行GD 的 configure , 虽然依然是 libgd.la 错误,但提示的已经不是 jpeg6 的问题了。
    这下是 freetype2 的问题了,如下:
    ---------------------------

    /usr/bin/ld: /usr/local/freetype2/lib/libfreetype.a(ftinit.o): relocation R_X86_64_32 against `tt_driver_class' can not be used when making a shared object; recompile with -fPIC
    /usr/local/freetype2/lib/libfreetype.a: could not read symbols: Bad value
    collect2: ld returned 1 exit status
    make[2]: *** [libgd.la] 错误1
    make[2]: Leaving directory `/data/soft/php/gd-2.0.35'
    make[1]: *** [all-recursive] 错误1
    make[1]: Leaving directory `/data/soft/php/gd-2.0.35'
    make: *** [all] 错误2
    ---------------------------

    着看上去是freetype2 出错但其实是zlib安装问题
    原本的编译方法就直接是:
    ---------------------------
    # tar zxvf zlib-1.2.3.tar.gz
    # cd zlib-1.2.3
    #./configure --prefix=/usr/local/zlib2/ && make && make install
    在32位上以这种方式安装是没问题的.但64的话,要改一改,如下
    ---------------------------
    解决方法:重新编译安装zlib,步骤如下:(在重新编译之前记得要把之前安装在/usr/local/zlib2里头的文件都完全删除)
    # tar -zxvf zlib-1.2.3.tar.gz
    # cd zlib-1.2.3
    #./configure
    #vi Makefile
    找到 CFLAGS=-O3 -DUSE_MMAP
    在后面加入-fPIC,即变成CFLAGS=-O3 -DUSE_MMAP -fPIC
    # make
    # make install
    -----------------------------
    然后再重新编译 freetype (在重新编译之前记得要把之前安装在/usr/local/freetype里头的文件都完全删除)
    #./configure --prefix=/usr/local/freetype2/ && make && make install

     Zlib 跟 freetype 的安装一定要按照顺序,不然解决不了问题.
    -----------------------------

    行了!这下子 freetype 也没问题了!但GD的编译还是不过,错误如下:

    /usr/bin/ld: /usr/local/libpng2/lib/libpng12.a(libpng12_la-png.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
    /usr/local/libpng2/lib/libpng12.a: could not read symbols: Bad value
    collect2: ld returned 1 exit status
    make[2]: *** [libgd.la] 错误1
    make[2]: Leaving directory `/data/soft/php/gd-2.0.35'
    make[1]: *** [all-recursive] 错误1
    make[1]: Leaving directory `/data/soft/php/gd-2.0.35'
    make: *** [all] 错误2
    -----------------------------
    libpng的问题,我们改一改编译以及安装的方式。跟上边2个一样,要先把/usr/local/libpng2 都删干净,然后再重新编译安装。
    编译安装 libpng
    #tar zxvf libpng-1.2.34.tar.gz
    #cd libpng-1.2.34
    #cp scripts/makefile.gcmmx makefile
    #./configure --prefix=/usr/local/libpng2/ 
    # vi Makefile 
    找到 CFLAGS = -g -O2 后边加上 -fPIC
    # make && make install
    -----------------------------

    好了,真像玩游戏过三关的样子.....
    把最后这 libpng 也解决了,这GD也总算是编译好了。
    接下来终于能编译  php-5.2.6

    # tar zxvf php-5.2.6.tar.gz
    # cd php-5.2.6
    # ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-jpeg-dir=/usr/local/jpeg6/ --with-png-dir=/usr/local/libpng2/ --with-gd=/usr/local/gd2/ --with-freetype-dir=/usr/local/freetype2/  --with-zlib-dir=/usr/local/zlib2/ -with-mysql=/usr/local/mysql  --with-curl=/usr/local/curl --with-gettext=/usr/local/gettext

    好了! 又卡住了!!!!!
    如果 mysql 是使用rpm方式安装,除了安装server跟client记得装上其开发包 MySQL-devel-community
    如果你的mysql是装在另外一台机器,这么你编辑安装php也只需装上 MySQL-client-community 跟 MySQL-devel-community
    不然php ./configure  的时候会出现找不到 mysql 的错误

    #####################

    如果你已经安装了上述说的rpm包,或者是以编译方式安装mysql的,还是出错,并提示 Cannot find libmysqlclient_r 。

    如下:

    checking for MySQL support… yes checking for specified location of the MySQL UNIX socket… no checking for MySQL UNIX socket location… no configure: error: Cannot find libmysqlclient_r under /usr/local/mysql. Note that the MySQL client library is not bundled anymore!

    -----------------------------

    或者是:

    checking for MySQL support… yes checking for specified location of the MySQL UNIX socket… no checking for MySQL UNIX socket location… no configure: error: Cannot find libmysqlclient_r under /usr. Note that the MySQL client library is not bundled anymore!

    -----------------------------

    那么,你需要注意了,你可能在编译APACHE的时候,使用–with-mpm模块,请在编译MYSQL的时候加上 –enable-thread-safe-client.

    这是PHP5.2的一个改进,在PHP5.2.0之前的版本都不需要MYSQL启用安全线程。 因此在安装MYSQL时,configure应该是: ./configure prefix=/usr/local/mysql –with-extra-charsets=all –enable-thread-safe-client

    如果是rpm安装的话,经过一番研究,得出所需文件 libmysqlclient rpm包默认安装在了 /usr/lib64/mysql 下。

    但PHP编译的时候找的是 /usr/lib/mysql 所以就找不到了。

    这么好办,做个软连接即刻解决 ln -s /usr/lib64/mysql /usr/lib

    这样就会有了 /usr/lib/mysql 这一路径,PHP编译顺利通过!

    最后 ZendOptimizer 也需要装上 X64 版本.最新下载地址为:

    http://downloads.phpchina.com/zend/optimizer/

    http://www.oschina.net/question/17_87

  • 相关阅读:
    iOS 苹果开发证书失效的解决方案(Failed to locate or generate matching signing assets)
    iOS NSArray数组过滤
    App Store2016年最新审核规则
    iOS 根据字符串数目,自定义Label等控件的高度
    iOS 证书Bug The identity used to sign the executable is no longer valid 解决方案
    Entity FrameWork 增删查改的本质
    EF容器---代理类对象
    Entity FrameWork 延迟加载本质(二)
    Entity FrameWork 延迟加载的本质(一)
    Entity FrameWork 增删查改
  • 原文地址:https://www.cnblogs.com/xiangxiaodong/p/3225217.html
Copyright © 2020-2023  润新知