编译问题

这章节搜集了很多编译时会产生的错误情况。 1. 我用匿名CVS得到最新版的源代码包, 但没有配置脚本文件! 2. 我在配置 PHP 在 Apache下工作时出了问题。 它说不能找到 httpd.h, 可是我看它就在那里! 3. 当我运行conifgure时,它说它不能找到include文件或 一些库: GD, gdbm, 或其它的一些包! 4. 我在编译文件 language-parser.tab.c时, 出错,提示: yytname undeclared. 5. 当我运行 make, 起初正常但 最终失败了,在连接最后的应用时,出错说找不到一些文件。 6. 在连接 PHP 时, 出一堆错说 undefined references。 7. 我不清楚怎样在 Apache 1.3下编译PHP。 8. 我按照步骤一步一步安装了Apache模块(Unix下), 可是在浏览器里打开 PHP 脚本时它却问我是否要保存。 9. 系统说使用: --activate-module=src/modules/php4/libphp4.a, 可那文件根本不存在, 我只好改成 --activate-module=src/modules/php4/libmodphp4.a 好了,它不工作了! 该怎么办? 10. 我要把PHP编译成Apache的静态模块,用: --activate-module=src/modules/php4/libphp4.a 可是系统说我的编译器不是 ANSI 兼容的。 11. 我用 --with-apxs编译PHP时, 我总是得到一些奇怪的错误。 12. 在 make时, 我得到很多关于microtime错误, 还有许多 RUSAGE_ stuff. 13. 我想升级PHP,我在哪可以看到我现在运行的PHP 的当初配置安装时所使用的./configure 一行的内容? 14. 编译带GD库的PHP时,它不是给一些奇怪的错, 就是执行时产生 segfaults 段错误.
1. 我用匿名CVS得到最新版的源代码包, 但没有配置脚本文件!
你必须安装 GNU autoconf 包,这样可以从 configure.in生成配置脚本文件. 只要运行在CVS服务器得到源代码的顶级目录下的 ./buildconf。 (注意, 除非你运行configure --enable-maintainer-mode 选项, 配置脚本是不会重新生成, 即使configure.in 文件已更新, 所以当你发现 configure.in 改变了,你也要手工做一遍. 在config或config.status 运行后应该在你的Makefile里能看到象@VARIABLE@这样的标号。)
2. 我在配置 PHP 在 Apache下工作时出了问题。 它说不能找到 httpd.h, 可是我看它就在那里!
你要告诉 configure/setup 脚本 Apache 的顶级目录的位置。 就是说你要标明 --with-apache=/path/to/apache , 而不是 --with-apache=/path/to/apache/src.
3. 当我运行conifgure时,它说它不能找到include文件或 一些库: GD, gdbm, 或其它的一些包!
你可以看看 configure 脚本,那些头文件或非标准库的位置,要送一些特殊的标志给C预处理器。例如:

CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure假如你的shell使用 csh-variant , 那么它将会是 (为什么?):

env CPPFLAGS=-I/path/to/include LDFLAGS=-L/path/to/library ./configure
4. 我在编译文件 language-parser.tab.c时, 出错,提示: yytname undeclared.
你需要更新你的 Bison 版本. 你可以在 ftp://ftp.gnu.org/pub/gnu/bison/找到最新版本.
5. 当我运行 make, 起初正常但 最终失败了,在连接最后的应用时,出错说找不到一些文件。
一些老版本的 make 不能把 functions 目录下的编译的文件放到同一个目录下, 试着运行 cp *.o functions 然后再运行 make 看看是否会好些。 如果好了,你真的应该更新你的GNU Make的版本了。
6. 在连接 PHP 时, 出一堆错说 undefined references。
看看文件里的连接行,确认所有的相关包都已经正确包含。通常这样是因为缺少'-ldl',还有一些你想支持的数据库包。
如果你是在连接到 Apache 1.2.x, 你记得要在在EXTRA_LIBS 行增加一些额外的信息 并且重运行 Apache's Configure 脚本吗? 参见发行包里的 INSTALL 文件。
很多人说他们一增加 '-ldl' 马上得到了 libphp4.a 。
7. 我不清楚怎样在 Apache 1.3下编译PHP。
事实上很简单,按下面的步骤:

取得 Apache 1.3 源代码,在下面的位置 http://www.apache.org/dist/.

在某个目录下解压出来, 如 /usr/local/src/apache-1.3.

在PHP的发行包目录下,编译 PHP ,./configure --with-apache=/<path>/apache-1.3 ( 用户实际的apache-1.3目录位置替代 <path> .

打入: make 然后: make install 编译PHP,拷必须的文件到Apache目录下。

改变到你的 /<path>/apache-1.3/src 目录,编辑 Configuration文件. 把下面的行增加到文件里: AddModule modules/php4/libphp4.a.

打入: ./Configure 然后: make.

这样你就有了一个 httpd 文件!

注意:你也可以使用新的Apache ./configure 脚本. 见发行包里的 README.configure 当然也要看看PHP发行包里的 INSTALL 文件。
8. 我按照步骤一步一步安装了Apache模块(Unix下), 可是在浏览器里打开 PHP 脚本时它却问我是否要保存。
这意味着你的PHP模块没有被加载。你可从下面三点来检查:

确认你运行的Httpd是你刚刚编译了PHP的Httpd. 可以运行: /path/to/binary/httpd -l
如果你没有看到 mod_php4.c 列出来,那么你运行了不正确的Httpd. 最好重新安装它。

确认你在 Apache .conf 文件里增加了正确的Mime 类型.它应该是这样: AddType application/x-httpd-php3 .php3 ( PHP 3)
或 AddType application/x-httpd-php .php ( PHP 4)
也保证 AddType 这行没有包括在 <Virtualhost> 或 <Directory> 块里,它们会使它无效。

最后, Apache 1.2 和 Apache 1.3默认的配置文件的位置是不同的. 你应该检查你增加了AddType行的配置文件的位置 . 你可以在 httpd.conf 放一些明显的错误或改变,这样如果这文件被读的话,系统会通知你。

9. 系统说使用: --activate-module=src/modules/php4/libphp4.a, 可那文件根本不存在, 我只好改成 --activate-module=src/modules/php4/libmodphp4.a 好了,它不工作了! 该怎么办?
请注意 libphp4.a 事实并不存在. apache 进程会创建它!
10. 我要把PHP编译成Apache的静态模块,用: --activate-module=src/modules/php4/libphp4.a 可是系统说我的编译器不是 ANSI 兼容的。
这个错误消息是 Apache 误导的,可以用更新版本来修正它。
11. 我用 --with-apxs编译PHP时, 我总是得到一些奇怪的错误。
出现这样的情况可以从三点来检查. 第一, 因为某种原因,Apache 在编译apxs Perl 脚本的时候, 它没有创建适当的标志变量, 找到你的apxs脚本 (试试命令 which apxs, 通常在 /usr/local/apache/bin/apxs or /usr/sbin/apxs. 打开它找到象下面这样的行:

my $CFG_CFLAGS_SHLIB  = ' ';          # substituted via Makefile.tmplmy $CFG_LD_SHLIB      = ' ';          # substituted via Makefile.tmplmy $CFG_LDFLAGS_SHLIB = ' ';          # substituted via Makefile.tmpl如果你看到的是这样,那么问题就出在这里. 因为值里包含的是空格或其它不正确的值, 如 'q()'. 把它样变成象下面的那样:

my $CFG_CFLAGS_SHLIB  = '-fpic -DSHARED_MODULE'; # substituted via Makefile.tmplmy $CFG_LD_SHLIB      = 'gcc';                   # substituted via Makefile.tmplmy $CFG_LDFLAGS_SHLIB = q(-shared);              # substituted via Makefile.tmpl第二种可能仅仅出现在Red Hat 6.1 和 6.2上. apxs 脚本 Red Hat 版有错. 看这行:

my $CFG_LIBEXECDIR    = 'modules';         # substituted via APACI install如果你看到了,就把它改成下面的行:

my $CFG_LIBEXECDIR    = '/usr/lib/apache'; # substituted via APACI install第三, 你要是 重配置/重安装 Apache, 必须在 ./configure 后,在 make之前,执行make clean
12. 在 make时, 我得到很多关于microtime错误, 还有许多 RUSAGE_ stuff.
在安装过程中 make时,如果你看到下面的错:

microtime.c: In function `php_if_getrusage':microtime.c:94: storage size of `usg' isn't knownmicrotime.c:97: `RUSAGE_SELF' undeclared (first use in this function)microtime.c:97: (Each undeclared identifier is reported only oncemicrotime.c:97: for each function it appears in.)microtime.c:103: `RUSAGE_CHILDREN' undeclared (first use in this function)make[3]: *** [microtime.lo] Error 1make[3]: Leaving directory `/home/master/php-4.0.1/ext/standard'make[2]: *** [all-recursive] Error 1make[2]: Leaving directory `/home/master/php-4.0.1/ext/standard'make[1]: *** [all-recursive] Error 1make[1]: Leaving directory `/home/master/php-4.0.1/ext'make: *** [all-recursive] Error 1
那是你的系统出错了. 你应该修复 /usr/include 文件.具体做法是安装和你的glibc匹配的glibc-devel 包. 这些错绝对和PHP无关,为了证明,你可以这样做:

$ cat >test.c <<X#include <sys/resource.h>X$ gcc -E test.c >/dev/null如果出错,证明你的包含文件受损了.
13. 我想升级PHP,我在哪可以看到我现在运行的PHP 的当初配置安装时所使用的./configure 一行的内容.?
你可以看你安装PHP源目录下的 config.nice 文件. 如果不行还有另外一种方法.你只要简单运行

<?php phpinfo(); ?>脚本. 在输出页面的第一行,就是 ./configure 行, 是你当初用来配置PHP的那行.
14. 编译带GD库的PHP时,它不是给一些奇怪的错, 就是执行时产生 segfaults 段错误.
你必须确认你在编译 GD 库 和 PHP 时所使用同样的依赖库 (例如 libpng).

(0)

相关推荐

  • win7下从ruby源代码编译安装的方法

    工作中需要在c++代码中嵌入ruby c api,然而在vs工程中编译失败,所以现在通过手动从源代码编译ruby寻找原因(之前使用rubyinstaller安装). 先从官网下载ruby 2.4.1 版本,https://www.ruby-lang.org/en/downloads/ 从安装指导可以看到,官方只提供了linux平台下的编译安装步骤,https://www.ruby-lang.org/en/documentation/installation/#building-from-sour

  • AutoIt脚本的反编译和代码格式化问题分析

    最近集中冒出一波AutoIt的恶意脚本来,也就多看了几个这类的样本.AutoIt脚本是以".au3"为扩展名的明文脚本,但病毒作者自然不会把明文的脚本放出来.所以自然用到了AutoIt自带的这个Au2Exe的工具: 可以看到AutoIt允许用户将au3的明文脚本编译成exe文件或者a3x文件.exe文件自不必赘述,就是我们平时熟悉的PE文件,但如果编译成exe文件,则失去了AutoIt脚本在恶意程序领域的优势(懂的自然懂,不细说),所以目前捕获的大多数恶意样本都是将脚本编译成a3x文件

  • CentOS6.7系统中编译安装MariaDB数据库

    环境:CentOS6.7,minimal安装. 前提条件:安装了编译环境,安装了Apache. 1.下载解压 # wget http://archive.mariadb.org//mariadb-5.5.44/bintar-linux-x86/mariadb-5.5.44-linux-i686.tar.gz # tar xf mariadb-5.5.44-linux-x86_64.tar.gz -C /usr/local # cd /usr/local 2.创建数据目录 # mkdir -pv

  • 浅谈Sizzle的“编译原理”

    Sizzle,是jQuery作者John Resig写的DOM选择器引擎,速度号称业界第一.作为一个独立全新的选择器引擎,出现在jQuery 1.3版本之后,并被John Resig作为一个开源的项目.Sizzle是独立的一部分,不依赖任何库,如果你不想用jQuery,可以只用Sizzle,也可以用于其他框架如:Mool, Dojo,YUI等. 前几天在准备一个关于jQuery的分享PPT,问同事关于jQuery除了使用方法之外还有没有其他特别想了解一下的,有人提到了想了解下它的选择器是怎么实现

  • Linux 6下安装编译安装Nginx的步骤

    Linux 6下安装编译安装Nginx的步骤 前言: Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.在高连接并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一.能够支持高达50,000个并发连接数的响应,而且内存开销极小.这也是Nginx广受欢迎的重要原因.本文演示了基于Linux 6下编译安装Nginx,供大家参考. 一.安装环境 # cat /etc/issue Red Ha

  • Centos 6中编译配置httpd2.4的多种方法详解

    前言 我们使用linux的过程中,一定会用到httpd这个服务,在centos7上,默认安装的httpd就是2.4版本,大家都知道,2.4版本相对之前的版本已经做了改进,用起来更加方便,但是我们的centos6上,默认安装的版本是2.2,那么,如果我们想要在centos6上安装httpd2.4版本的话,我们要如何做呢? 本文中,小编会给大家介绍两种方法,来实现在centos6上编译安装httpd2.4版本. 方法一 分别编译法 1.下载源码并解压缩 我们可以使用yum info httpd和yu

  • asp.net源程序编译为dll文件并调用的实现过程

    很多时候,我们需要将.cs文件单独编译成.dll文件,这就需要使用csc命令将.cs文件编译成.dll动态链接库文件.具体的操作步骤如下: 打开命令窗口->输入cmd到控制台->cd C:WINDOWSMicrosoft.NETFrameworkv1.1.4322 转到vs.net安装的该目录下->执行csc命令csc /target:library File.cs->在该目录下产生一个对应名字的.dll文件(前提:把.cs文件放到C:WINDOWSMicrosoft.NETFra

  • 解决.net framework 4.0环境下遇到版本不同编译不通过的方法详解

    本文内容:1.问题引出2.问题解决3.原因分析 最近部门的开发环境都更新到了WIN7+.NET framework4+VS2010上,在体验新技术和新环境带给我们提高效率的方式方法的同时也带来了一些兼容性的问题:这几天项目闲暇时在研究SQLite,在做实验的时候碰到个问题,代码编译通过执行时反复异常中断,查到后面原来是SQLite.dll是在framework2.0环境下编译的而现在的运行环境是framework4.0,所以就出现了运行异常,如图: 由于以后的开发过程中,可能会引用一些第三方的组

  • 保护.net中的dll文件方法(防止破解、反编译dll)

    .net是一种建立在虚拟机上执行的语言,它直接生成 MSIL 的中间语言,再由.net编译器 JIT 解释映象为本机代码并交付CPU执行.中间语言很容易被反编译,所以研究下如何有效的保护dll文件. 我大致的方法为 :强签名+混淆+加密. 强签名 强命名程序集,可以确保你的程序集唯一,而不被篡改.冒用等:即使相同名字的程序集如果签名也会不同.强签名很简单 为项目添加强名称方法:1.右键单击项目,打开属性窗口;2.在属性窗口里选择<签名>标签,选中为程序集签名的选项,在下拉列表里选择新建,如下图

  • Delphi2007编译的程序在Win7下图标模糊的解决办法

    使用Delphi2007编译GUI程序的时候会发现在Win7的状态栏中显示的程序图标非常模糊,如果原始的图标清晰度怎么样.造成这样结果的原因是因为Delphi2007生成的icon图标只符合XP等系统的要求,没有对Win7进行优化处理.网上有很多处理的方式,后来找到一个最简单有效的方法,就是只设置项目的图标而不要设置Form窗口的图标. 参考资料: Blurred Delphi Form Icon in Windows 7 Taskbar Delphi form icons are blurry

随机推荐