编译问题

这章节搜集了很多编译时会产生的错误情况。 1.
我用匿名CVS得到最新版的源代码包, 但没有配置脚本文件! 2. 我在配置 PHP 在
Apache下工作时出了问题。 它说不能找到 , 可是我看它就在那里! 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模块,
可是在浏览器里打开 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时, 我总是得到一些奇怪的错误。

DSO模块加载模块提供了灵活性。

  1. 在 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下工作时出了问题。 它说不能找到 , 可是我看它就在那里!
    你要告诉 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 ./configure4.
    我在编译文件 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
    源代码,在下面的位置 在某个目录下解压出来, 如 /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. 这样你就有了一个 文件!
    注意:你也可以使用新的Apache ./configure 脚本. 见发行包里的
    README.configure 当然也要看看PHP发行包里的 INSTALL 文件。 8.
    我按照步骤一步一步安装了Apache模块, 可是在浏览器里打开 PHP
    脚本时它却问我是否要保存。
    这意味着你的PHP模块没有被加载。你可从下面三点来检查:
    确认你运行的Httpd是你刚刚编译了PHP的Httpd. 可以运行: /path/to/binary/ -l
    如果你没有看到 mod_php4.c 列出来,那么你运行了不正确的Httpd.
    最好重新安装它。 确认你在 Apache .conf 文件里增加了正确的Mime
    类型.它应该是这样: AddType application/x- .php3 ( PHP 3) 或 AddType
    application/x- .php ( PHP 4) 也保证 AddType 这行没有包括在 Virtualhost
    或 Directory 块里,它们会使它无效。 最后, Apache 1.2 和 Apache
    1.3默认的配置文件的位置是不同的.
    你应该检查你增加了AddType行的配置文件的位置 . 你可以在
    放一些明显的错误或改变,这样如果这文件被读的话,系统会通知你。 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
  2. 在 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.hX$ gcc -E test.c /dev/null如果出错,证明你的包含文件受损了.
  3. 我想升级PHP,我在哪可以看到我现在运行的PHP
    的当初配置安装时所使用的./configure 一行的内容.?
    你可以看你安装PHP源目录下的 config.nice 文件.
    如果不行还有另外一种方法.你只要简单运行 ?php phpinfo(); ?脚本.
    在输出页面的第一行,就是 ./configure 行, 是你当初用来配置PHP的那行. 14.
    编译带GD库的PHP时,它不是给一些奇怪的错, 就是执行时产生 segfaults
    段错误. 你必须确认你在编译 GD 库 和 PHP 时所使用同样的依赖库 (例如
    libpng).

模块的类型:

核心模块

标准模块

第三方模块

使用apxs编译安装模块

首先查看已经安装过mod_so模块了没

httpd -M

使用apxs来进行编译安装模块

安装mod_txt模块

cd /usr/local/src

wgethttp://apache.webthing.com/mod_txt/mod_txt.c

/usr/local/apache2/bin/apxs -c -i -a     mod_txt.c

l然后修改配置文件,并在httpd.con文件中的合适位置添加如下指令

AddOutputFilter  text-filter    .txt

AddType text/html       .txt

TextHeader      /path/to/header-file

TextFooter      /path/to/footer-file

再重启服务器,就可以用了

使用静态链接模块

编译时直接指定 ./configure –enable-modules=most

就一句话,编译时指定静态链接的模块。再make && make install

编译好就可以用了

使用动态链接模块

动态链接模块的使用方法

首先查看已经安装过mod_so模块了没

httpd -M

如果想使用某个动态链接的模块

Apache2.X

要在httpd.conf里加

LoadModule vhost_alia_module modules/mod_vhost_alias.so

LoadModule ssl_module modules/mod_ssl.so

才算启用模块

PS:LoadModule只能加载Apache的根目录的模块,要想加载其他路径的模块,需要用LoadFile换LoadModule

.老版本里DSO模块装入的顺序决定了Apache使用它们处理URL的顺序

Apache 1.3.X动态链接模块的使用方法

必须先用LoadModule将其加载,然后使用AddModule来启用

PS:在这个版本里,即使是静态编译的模块也需要用AddModule指令来启用。

为Apache添加新模块

天真的以为用yum install -y
php可以直接把php这个模块动态加载到Apache中,没什么副作用。副作用是会重新安装一个rpm包的apache。把php动态加载到新安装的那个apache上去了。而不是动态安装到之前的源码包上。

以DSO的方式安装PHP到Apache2.x

wget

tar zxvf 源码包的位置

cd 源码包解压后的位置

./configure  –prefix=/usr/local/php
–with-apxs2=/usr/local/apache2/bin/apxs

make && make install

虽说make
install会自动在Apache的httpd.conf文件中加入对php模版的调用,但还是建议检查一下httpd.conf是不是加了那些内容。

2.x的apache不支持php静态编译进apache了,只有1.3.x能静态编译

第一次编译Apache

./configure –prefix=/usr/local/apache2

安装PHP

./configure –prefix=/usr/local/php5.4
–with-mysql=/usr/local/mysql5.0.67 –with-apache=../apache_1.3.9

make && make install

第二次编译Apache

./configure –prefix=/usr/local/php5.4
–active-module=src/modules/php5/libphp5.a

make && make install

发表评论

电子邮件地址不会被公开。 必填项已用*标注