关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » HTML5 »交叉编译PHP5、Nginx、Squid的详细步骤

    交叉编译PHP5、Nginx、Squid的详细步骤

    2015-03-28 00:00:00 出处:趴在巨人肩上的矮子
    分享

    交叉编译php5

    软件版本:php-5.4.27

    依赖库:zlib,libxml2

    交叉编译器:arm-hisiv200-linux-gnueabi

    将交叉编译器路径添加到PATH中, 我的交叉编译器目录为/usr/local/arm-hisiv200-linux/,而交叉编译器在交叉编译器目录的/bin中,在控制台输入
    PATH=$PATH:/usr/local/arm-hisiv200-linux/bin/
    首先先交叉编译zlib,进入zlib源码目录。 执行CC=arm-hisiv200-linux-gnueabi-gcc ./configure –shared –prefix=ZLIB_PATH(编译成功后的安装路径) make && make install 在ZLIB_PATH中会有编译成功后的文件和配置。 然后交叉编译libxml2,进入libxml2源码目录。 执行CC=arm-hisiv200-linux-gnueabi-gcc ./configure –host=arm-hisiv200-linux-gnueabi –prefix=LIBXML2_PATH(编译成功后的安装路径) make && make install 在LIBXML2_PATH中会有编译成功后的文件和配置。 开始交叉编译php5,进入php5源码目录。 首先先执行./buildconf –force,为了防止出现 cp:cannot stat ‘sapi/cli/php.1′: No such file or directory 执行./configure –host=arm-hisiv200-linux-gnueabi –enable-shared –with-zlib-dir=ZLIB_PATH –with-libxml-dir=LIBXML2_PATH –disable-phar –with-sqlite –with-pdo-sqlite –without-iconv –enable-fpm –prefix=PHP5_PATH make && make install 编译好的php程序及配置就在PHP5_PATH中。

    交叉编译nginx

    软件版本:nginx-1.6.2

    依赖源码:pcre,zlib(这里是需要用到它们的源码)

    交叉编译器:arm-hisiv200-linux-gnueabi

    linux版本:32位ubuntu(这个很重要,主要是使用32位x86系统才能进行编译成功,因为字长不一样)

    交叉编译nginx与交叉编译php5不同就是nginx用的是依赖的库的源码,而php5用的是库文件。

    进入nginx-1.6.2源码目录。 在配置和编译nginx会出现很多错误,我们一个一个解决,首先我使用的configure配置如下:
    #!/bin/bash
    
    CC_PATH=/home/shanlink/Cross_compile/arm-hisiv200-linux/bin/arm-hisiv200-linux-gnueabi-gcc
    CPP_PATH=/home/shanlink/Cross_compile/arm-hisiv200-linux/bin/arm-hisiv200-linux-gnueabi-g++
    INSTALL_PATH=/home/shanlink/Cross_compile/nginx_ccs/
    PCRE_PATH=/home/shanlink/Cross_compile/pcre-8.11/
    ZLIB_PATH=/home/shanlink/Cross_compile/zlib-1.2.3/
    CC_OPTS="-I /home/shanlink/Cross_compile/arm-hisiv200-linux/target/include/"
    
    ./configure --prefix=$INSTALL_PATH --with-zlib=$ZLIB_PATH --with-pcre=$PCRE_PATH --with-cc=$CC_PATH --with-cpp=$CPP_PATH --with-cc-opt=$CC_POTS --with-ld-opt="-L /home/shanlink/Cross_compile/arm-hisiv200-linux/target/lib/"
    好的,把以上内容做成一个运行脚本,运行,出现一个错误:
    checking for OS
     + Linux 3.13.0-43-generic x86_64
    checking for C compiler ... found but is not working
    
    ./configure: error: C compiler /home/shanlink/Cross_compile/arm-hisiv200-linux/bin/arm-hisiv200-linux-gnueabi-gcc is not found

    解决办法就是:编辑auto/cc/name文件,在文件开头有如下一段,注释掉exit 1

    if [ "$NGX_PLATFORM" != win32 ]; then
    
        ngx_feature="C compiler"
        ngx_feature_name=
        ngx_feature_run=yes
        ngx_feature_incs=
        ngx_feature_path=
        ngx_feature_libs=
        ngx_feature_test=
        . auto/feature
    
        if [ $ngx_found = no ]; then
            echo
            echo $0: error: C compiler $CC is not found
            echo
            #exit 1        注释掉这一行     
        fi
    
    fi
    再次运行我们的配置脚本,这时候出现
    checking for TCP_INFO ... found
    checking for accept4() ... found
    checking for int size ...objs/autotest: 1: objs/autotest: Syntax error: word unexpected (expecting ")")
      bytes
    
    ./configure: error: can not detect int size
    cat: objs/autotest.c: No such file or directory

    解决方法:编辑auto/types/sizeof文件,找到

    ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS 
              -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"
    
    将的$CC改为x86上使用的gcc
    
    ngx_test="gcc $CC_TEST_FLAGS $CC_AUX_FLAGS 
              -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"
    再次运行我们的配置脚本,这时应该可以顺利配置完成。 执行make,这时候会出现一个错误
    checking for C compiler default output file name... a.out
    checking for suffix of executables... 
    checking whether we are cross compiling... configure: error: in `/home/shanlink/Cross_compile/pcre-8.11':
    configure: error: cannot run C compiled programs.
    If you meant to cross compile, use `--host'.
    See `config.log' for more details.
    make[1]: *** [/home/shanlink/Cross_compile/pcre-8.11//Makefile] Error 1
    make[1]: Leaving directory `/home/shanlink/Cross_compile/nginx-1.6.2'
    make: *** [build] Error 2

    这个是由于nginx在编译时会同时配置pcre并且进行编译,而由于是交叉编译,pcre的配置时需要添加–host=arm-hisiv200-linux-gnueabi,因为是由nginx自动配置的,所以我们需要手动添加此选项于pcre,然后再make,此选项添加在

    文件:objs/Makefile
    
    找到如下一段:
    /home/shanlink/Cross_compile/pcre-8.11//Makefile:    objs/Makefile
        cd /home/shanlink/Cross_compile/pcre-8.11/ 
        && if [ -f Makefile ]; then $(MAKE) distclean; fi 
        && CC="$(CC)" CFLAGS="-O2 -fomit-frame-pointer -pipe " 
        ./configure --disable-shared 
    
    将
        ./configure --disable-shared 
    改为
        ./configure --disable-shared --host=arm-hisiv200-linux-gnueabi(这个交叉编译器前缀填你们电脑上自己的)
    假如遇到一下错误,原因是你们的linux系统是64位的,而arm上一般都是32位的,所以会有这个错误,解决办法就是重新装一个32位的linux系统。
    src/core/ngx_slab.c: In function 'ngx_slab_alloc_locked':
    src/core/ngx_slab.c:209: error: integer constant is too large for 'long' type
    src/core/ngx_slab.c:209: error: comparison is always true due to limited range of data type
    src/core/ngx_slab.c:221: error: integer constant is too large for 'long' type
    src/core/ngx_slab.c:221: error: comparison is always false due to limited range of data type
    src/core/ngx_slab.c:223: error: integer constant is too large for 'long' type
    src/core/ngx_slab.c:223: error: comparison is always true due to limited range of data type
    src/core/ngx_slab.c:253: error: integer constant is too large for 'long' type
    src/core/ngx_slab.c:253: error: comparison is always true due to limited range of data type
    src/core/ngx_slab.c:262: error: integer constant is too large for 'long' type
    src/core/ngx_slab.c:262: error: comparison is always false due to limited range of data type
    src/core/ngx_slab.c:289: error: left shift count >= width of type
    src/core/ngx_slab.c:292: error: integer constant is too large for 'long' type
    src/core/ngx_slab.c:294: error: left shift count >= width of type
    src/core/ngx_slab.c:304: error: integer constant is too large for 'long' type
    src/core/ngx_slab.c:376: error: left shift count >= width of type
    src/core/ngx_slab.c: In function 'ngx_slab_free_locked':
    src/core/ngx_slab.c:499: error: integer constant is too large for 'long' type
    src/core/ngx_slab.c:499: error: comparison is always false due to limited range of data type
    src/core/ngx_slab.c:552: error: integer constant is too large for 'long' type
    src/core/ngx_slab.c:575: error: integer constant is too large for 'long' type
    src/core/ngx_slab.c:575: error: comparison is always false due to limited range of data type
    src/core/ngx_slab.c:582: error: integer constant is too large for 'long' type
    src/core/ngx_slab.c: In function 'ngx_slab_alloc_pages':
    src/core/ngx_slab.c:643: error: integer constant is too large for 'long' type
    src/core/ngx_slab.c:652: error: integer constant is too large for 'long' type
    src/core/ngx_slab.c:652: error: large integer implicitly truncated to unsigned type
    make[1]: *** [objs/src/core/ngx_slab.o] Error 1
    make[1]: Leaving directory `/home/shanlink/Cross_compile/nginx-1.6.2'
    make: *** [build] Error 2
    这时候继续make,还会出现两个错误,一个是
    src/os/unix/ngx_errno.c: In function 'ngx_strerror':
    src/os/unix/ngx_errno.c:37: error: 'NGX_SYS_NERR' undeclared (first use in this function)
    src/os/unix/ngx_errno.c:37: error: (Each undeclared identifier is reported only once
    src/os/unix/ngx_errno.c:37: error: for each function it appears in.)
    src/os/unix/ngx_errno.c: In function 'ngx_strerror_init':
    src/os/unix/ngx_errno.c:58: error: 'NGX_SYS_NERR' undeclared (first use in this function)
    make[1]: *** [objs/src/os/unix/ngx_errno.o] Error 1
    make[1]: Leaving directory `/home/shanlink/Cross_compile/nginx-1.6.2'
    make: *** [build] Error 2

    解决方法就是打开objs/ngx_auto_config.h,添加

    #ifndef NGX_SYS_NERR
    #define NGX_SYS_NERR    132
    #endif

    另一个错误

    objs/src/event/ngx_event_accept.o: In function `ngx_event_accept':
    /home/shanlink/Cross_compile/nginx-1.6.2/src/event/ngx_event_accept.c:64: warning: warning: accept4 is not implemented and will always fail
    objs/src/core/ngx_cycle.o: In function `ngx_init_cycle':
    /home/shanlink/Cross_compile/nginx-1.6.2/src/core/ngx_cycle.c:457: undefined reference to `ngx_shm_free'
    /home/shanlink/Cross_compile/nginx-1.6.2/src/core/ngx_cycle.c:462: undefined reference to `ngx_shm_alloc'
    /home/shanlink/Cross_compile/nginx-1.6.2/src/core/ngx_cycle.c:648: undefined reference to `ngx_shm_free'
    objs/src/event/ngx_event.o: In function `ngx_event_module_init':
    /home/shanlink/Cross_compile/nginx-1.6.2/src/event/ngx_event.c:525: undefined reference to `ngx_shm_alloc'
    collect2: ld returned 1 exit status
    make[1]: *** [objs/nginx] Error 1
    make[1]: Leaving directory `/home/shanlink/Cross_compile/nginx-1.6.2'
    make: *** [build] Error 2
    shanlink@ubuntu:~/Cross_compile

    同样的,我们需要修改objs/ngx_auto_config.h文件,在文件中加入

    #ifndef NGX_HAVE_SYSVSHM
    #define NGX_HAVE_SYSVSHM 1
    #endif
    好了,这时候make && make install就应该能编译过去了。 假如遇到其他编译问题,请参考:http://blog.csdn.net/fish43237/article/details/40515897

    交叉编译squid

    软件版本:squid-2.7-STABLE9

    交叉编译器:arm-hisiv200-linux-gnueabi

    系统:32位ubuntu

    在对squid进行交叉编译时,需要用到x86版本的squid,所以大家要进行两个版本的编译。

    首先编译x86版本的使用配置为
    ./configure --prefix=X86_SQUID_PATH
    make && make install 进入到squid源码目录下的src/文件夹,有个cf_gen程序,备份起来,交叉编译时会用到。 建立一个arm-linux.cache文件,写入
    ac_cv_epoll_works=
    ac_cv_af_unix_large_dgram=
    ac_cv_func_setresuid=
    ac_cv_func_va_copy=
    ac_cv_func___va_copy=
    执行
    #!/bin/bash
    
    ./configure --host=arm-hisiv200-linux-gnueabi --prefix=/home/shanlink/Cross_compile/squid_ccs/ --cache-file=arm-linux.cache

    这时应该是能够顺利通过的 执行make,会出现一个错误

    ./cf_gen: cannot execute binary file
    将之前备份的x86的cf_gen复制到src/目录下替换arm的 再次执行make,应该可以顺利通过编译 make install 完成
    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    商业智能成CIO优先关注点 技术落地方显成效(1)

    用linux安装MySQL时产生问题破解

    JAVA中关于Map的九大问题

    windows 7旗舰版无法使用远程登录如何开启telnet服务

    Android View 事件分发机制详解

    MySQL用户变量的用法

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。