注:文章中提到的一些文件,如x86masm_1.13.pl、x86masm_1.13.pl、pq_compat.h以及store.h都可以在我的CSDN下载资源里找到~

 

公元2012.04.14号晚上,我开始编译自己的Apache,中间经历了多少痛苦不堪的过程已经记不清了,感到欣慰的是,我发现自己真的变了~

我不再是大学里的那个小毛孩儿了,我想去做什么就会立即做,而不是再用各种理由去推脱自己,结果只能什么都学不到,什么都做不好。

现在的我对自己的责任心强了许多,原来总以为自己很成熟,甚至觉得别人不理解自己,现在才知道原来是多么的愚蠢,借口永远找不完,我可以找各种理由不去吃饭,通宵玩游戏,逃课,甚至一个月来北京一次,来陪我的女朋友,而自己确是穷的连饭都吃不上,几个哥们轮流供我大笑

现在的我,已经懂得照顾自己,虽然还是有些懒,但总归爱干净了,也不会再为了玩游戏而熬到半夜,熬到半夜多半是在看书,调程序~还有一半是陪女朋友呵呵,只要是陪女朋友,干啥都高兴哈哈!

言归正传,写写我的编译历程吧~

源代码版本:Zlib-1.2.6、OpenSSL-1.0.1、Apache-2.2.22、ActivePerl-5.12.4.1205、awk95.exe

下面这一段是复制别人的呵~主要是这些都是一样的,没必要在自己去写,而且别人找到的资源比我的也要好,我主要说的是自己在编译中遇到的问题和解决方案。毕竟大家编译自己的Apache用的版本都不是同一个,所以,如果有和我用一样版本的源代码编译的同学们,至少可以拿我的作为参考~~

{##参考自: http://demon.tw/software/windows-apache-ipv6.html}

1. 安装Visual Studio 2008:这个,不用介绍了吧

2. 安装Perl和awk:下载ActivePerl-5.12.4.1205并安装;下载awk95.exe,重命名为awk.exe并复制到C:\Windows目录下

3. 编译zlib库:官网下载zlib源码,解压至C:\build\zlib,运行Visual Studio 2008命令行,在zlib目录下运行命令

  1. nmake -f win32\Makefile.msc  

到这里都还比较轻松,接下来才是崩溃的时刻!

4. 编译OpenSSL库:官网下载OpenSSL源码,解压至C:\build\openssl,运行Visual Studio 2008命令行,在openssl目录下运行命令

  1. perl Configure VC-WIN32  
  2. ms\do_ms  
  3. nmake -f ms\ntdll.mak  

{##参考结束}

上面的这段命令对于没有做过任何修改的OpenSSL-1.0.1 是永远都编译不过去的。

怎么做呢?

{##参考自:http://blog.csdn.net/lee353086/article/details/7378835}

只要把

  1. perl Configure VC-WIN32  

修改为

  1. perl Configure VC-WIN32 no-asm  

就可以编译过去。

{##参考结束}

这是为什么?

为了找到原因,我把no-asm去掉再次编译,报出错误如下图所示:

没有no-asm时的错误信息

在google、baidu上逛了整整半个周日,只搜到了一些英文网站中(需要Fan_Qiang)的确有和我相同的错误信息报出,但是,回答的人都很少,我草草的瞄了一眼就悲剧的把网页给关了...直到这个周一的下午,我还纠结在这个问题上,蛋都碎了!

于是,继续FQ,再试一次!

于是乎,我又进了那个网页(问题地址:http://www.mail-archive.com/openssl-dev@openssl.org/msg30681.html),仔细浏览之后,我面无表情的打开了下面唯一一个回复给出的链接,顿时“茅厕”顿开!尼玛这就是宝藏的入口啊!当时那个鸡冻啊!当年哥伦布发现新大陆估计也顶多就那么鸡冻!

里面的回复中给出的地址是:http://cvs.openssl.org/chngview?cn=22302

打开链接,一向英语很差的我也硬着头皮看起来,看得出来,大概意思就是介绍x86masm.pl(在目录openssl\crypto\perlasm下)这个文件从1.13版本到1.14版本的一些修改,于是乎,果断把两个版本都down下来,和OpenSSL中自带的x86masm.pl一对比,的确是有些不同!但是到底哪个是的呢?试吧!

幸亏我用了SVN控制版本,刚才编译修改的东西被我果断还原了~又把一些编译时新增的文件夹和文件全部删掉,用1.14版本的x86masm.pl替代了原有的。

依次执行:

  1. perl Configure VC-WIN32  
  2. ms\do_ms  
  3. nmake -f ms\nt.mak      #编译静态库,生成文件在out32文件夹下  
  4. nmake -f ms\ntdll.mak     #编译动态库,生成文件在out32dll文件夹下,这两个可以选择编译一个就行  

等了大概几分钟时间,顺利编译~哦也!OpenSSL就这么被我稀里糊涂的搞定了~

好吧,我还没有兴奋过头,抓紧时间继续编译Apache吧~

5. 编译Apache:官网下载Apache源码,解压至C:\build\httpd,复制之前编译好的zlib和OpenSSL的文件夹至httpd\srclib目录下,打开httpd\srclib\apr\include\apr.hw,将

  1. #define APR_HAVE_IPV6 0  

改为

  1. #define APR_HAVE_IPV6 1  

这是为了支持IPV6.

运行Visual Studio 2008命令行,在httpd目录下运行命令

  1. nmake /F Makefile.win INSTDIR="C:\Apache" installr  

其中,INSTDIR=“C:\Apache”是指定你要把Apache安装到的路径。

很不幸,编译再次在某个地方中断掉了...这是为什么?为什么别人编的好好的,我却老是出问题呢?我的环境变量也都配的没有问题啊,亲,这到底是怎么了?我不禁仰天长啸一声:你妹啊!

但是,这么关键的时刻怎么可以掉链子!我调整了一下情绪感到胜利已离我不远了,继续!

我仔细看了一下报错信息“不知道怎么调用XXXX文件”,这就奇怪了,程序还能不知道怎么调用文件?估计是没有吧!

打开目录,果然没有...下之!

于是乎,就这么折折腾腾的编译,停止,编译,停止,总共有两个文件不存在,我就从网上down下了这两个文件:pq_compat.h和store.h,并放到httpd\srclib\openssl\inc32\openssl目录下,终于,编过了~~

就这样,支持IPv6的Apache就编译好了,进入C:\Apache\bin目录,运行

  1. httpd.exe -k install  

就可以把Apache注册为系统服务了~

但是,事情还没有结束!

记得打开C:\Apache\conf\httpd.conf配置文件

找到#ServerName XXXX:XX  (具体的忘了)修改为ServerName 127.0.0.1:80(80端口只要和Listen的端口一样就可以,如果端口被占用,可以换另一个如:8080,但是一定要保持与Listen的端口一样),然后,搞定!

终于可以安稳的睡觉了~

BTW:

最后写的比较仓促,很多异常都忘了截图,所以,以后再补上吧~