返回列表 发帖

在WINDOWS环境下编译APACHE源码的方法

网上数种不同的说明,让我相当困惑,由此还是亲身试验,寻找可行的方法。

目标:在WINDOWS2003环境下编译APACHE源码版本

原因:APACHE的普通使用版本漏洞较多,而发放的补丁是以源码形式提供,WINDOWS环境下不方便编译

解决:最好的方式还是使用 APACHE官方提供的“修复了BUG放出的XX版本的源码包”,基于它再去作编译工作,有效节省我们的时间,也避免带来APACHE某模块不能使用的问题

下载APACHE源码包

http://labs.renren.com/apache-mirror//httpd/找到WIN环境的适合版本

注意版本后面的时间,他代表打入最新的补丁包会有哪些

本地环境

安装VC6绿色版,并COPY一个EXE文件至他的安装目录下

D:\Program Files\Microsoft Visual Studio\Common\Tools

并把此文件awk95.exe从改名为:awk.exe

因为是VC6绿色版,功能不全,应当把WINDOWS/SYSTEM32目录下的XCOPY.EXE放至安装目录的BIN目录下

编译调试上的若干问题

打开APAHCE源码包,找到Apache.dsw作为VC工程打开

OK后打开菜单:工程-设置活动工程-installbin

请注意以下的操作,注释用的语法是/* */,一开始我就以为是#号,结果连连出错

1) 下载源码后解压,使用VC打开Apache.dsw文件,设置BuildBin classess 工程为Active。
2
)开始编译,在编译中VC可能会提示错误。
3
)如果编译提示没有找到strings.h和inet.h 错误:

D:/httpd-2.2.11/srclib/apr/include/apr_want.h(52): Could not find the file strings.h
D:/httpd-2.2.11/srclib/apr/include/apr_want.h(121): Could not find the file arpa/inet.h   


打开httpd-2.2.11/srclib/apr/include/apr_want.h 文件,把以下行注释掉:

#if APR_HAVE_STRINGS_H
#include <strings.h>
#endif


#if APR_HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif


4
) 如果编译时候提示不支持 LDAP v2.0错误:

apr_ldap_stub.c
./include/apr_ldap.h(132) : fatal error C1189: #error :  Support for LDAP v2.0 toolkits has been removed from apr-util. Please use an LDAP v3.0 toolkit.
apr_ldap_url.c
apr_ldap_url.c
./include/apr_ldap.h(132) : fatal error C1189: #error :  Support for LDAP v2.0 toolkits has been removed from apr-util. Please use an LDAP v3.0 toolkit.
Generating Code...


打开httpd-2.2.11/srclib/apr-util/include/apr_ldap.h 文件,注释该行代码:

#error Support for LDAP v2.0 toolkits has been removed from apr-util. Please use an LDAP v3.0 toolkit.

5) 如果出现identifier 'SQLLEN' 错误:

D:httpd-2.2.11/srclib/apr-util/dbd/apr_dbd_odbc.c(134) : error C2061: syntax error : identifier 'SQLLEN'


打开文件:httpd-2.2.11/srclib/apr-util/dbd/apr_dbd_odbc.c,在文件头部添加以下行:

typedef INT32 SQLLEN;

6) 如果出现LDAP_VENDOR_NAME 错误:

D:/httpd-2.2.11/srclib/apr-util/ldap/apr_ldap_init.c(194) : error C2146: syntax error : missing ';' before identifier 'LDAP_VENDOR_NAME'
D:/httpd-2.2.11/srclib/apr-util/ldap/apr_ldap_init.c(195) : error C2065: 'LDAP_VENDOR_NAME' : undeclared identifier
D:/httpd-2.2.11/srclib/apr-util/ldap/apr_ldap_init.c(195) : error C2143: syntax error : missing ';' before 'string'


打开httpd-2.2.11/srclib/apr-util/ldap/apr_ldap_init.c 文件,注释以下行:

LDAP_VENDOR_NAME

7) 如果出现WtsApi32.h没有包含错误:

D:/httpd-2.2.11/support/win32/ApacheMonitor.c(45) : fatal error C1083: Cannot open include file: WtsApi32.h': No such file or directory


该提示表示没有安装或配置Microsoft 的PlatformSDK,需要去微软网站上下载PlatformSDK,并安装。
8)
如果提示awk 错误:

'awk' 不是内部或外部命令,也不是可运行的程序或批处理文件。
Error executing c:/windows/system32/cmd.exe.


这个错误是由于没有安装awk工具导致,可以先到http://www.gnu.org/software/gawk/ 下载一个gawk进行安装。如果安装的目录为:C:/Program Files/GnuWin32,在该目录下可以看到一个bin目录,需要把该目录添加到VC Executable files。我的bin目录完整路径为:C:/Program Files/GnuWin32/bin,以下图以该目录为例子进行添加

Platform SDK February 2003:

http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm

如果没有,在搜索框中输入Platform SDK,找到2003的版本下载进行安装

一,搜出目录下WtsApi32.h文件,COPYD:\Program Files\Microsoft Visual Studio\VC98\Include

二,搜出目录D:\Program Files\Microsoft Platform SDK\Libwtsapi32.lib文件,COPY

D:\Program Files\Microsoft Visual Studio\VC98\Lib

最终输出

我很困惑的是为什么输出的目录最终为:C:\Apache22

这个让我找了很久,我一直以为会在源码同级目录下,但是经过如上的各次调整后,输出出来的版本相当正常。

欢迎光临:逐梦论坛

返回列表

Powered by Discuz! 7.2   论坛QQ群:逐梦论坛群

© 2001-2021 Comsenz Inc. 鲁公网安备 37120302000001号