想必学习apache原代码的人都希望亲自编译一下apache。俗话说,万事开头难。在winxp下用vc2005 ide编译apache源码并不是一件轻松的事,还真让我郁闷了好几天。希望大家不要因为开始的一点点困难就丧失了学习apache的积极性:)
安装SDK;
安装VC++2005 Express;
安装awk;
step3 编译源代码:
在编译过程中,经常会出现以下三类错误:
-
class 1:unresolve error,错误如下:
Creating library ./Debug/libapr-1.lib and object ./Debug/libapr-1.exp
filestat.obj : error LNK2019: unresolved external symbol __imp__AllocateAndInitializeSid@44 referenced in function _resolve_prot
filestat.obj : error LNK2019: unresolved external symbol __imp__FreeSid@4 referenced in function _free_world
rand.obj : error LNK2019: unresolved external symbol __imp__CryptReleaseContext@8 referenced in function _apr_generate_random_bytes@8 rand.obj : error LNK2019: unresolved external symbol __imp__CryptGenRandom@12 referenced in function _apr_generate_random_bytes@8 - class 2:rc.exe error, 错误如下:
fatal error RC1107: invalid usage; use RC /? for Help
Project : error PRJ0002 : Error result 1 returned from 'C:/Program Files/Microsoft Visual Studio 8/VC/bin/rc.exe'.
Build log was saved at "file://d:/Tools/Apache/httpd-2.2.4/Debug/BuildLog.htm"
libhttpd - 1 error(s), 0 warning(s) - class 3:copy error, 错误如下:
NMAKE : fatal error U1077: 'copy' : return code '0x1'
- class 1:unresolve error;http://www.apachelounge.com/forum/viewtopic.php?t=575给出了解决方法:
<VC2005>表示VC2005的安装目录,我的是C:/Program Files/Microsoft Visual Studio 8
<SDK>表示SDK的安装目录,我的是C:/Program Files/Microsoft Platform SDK
1. 在<VC2005>/VC下新建文件夹PlatformSDK;
2. 分别将SDK下的bin、lib、include拷贝到PlatformSDK;
3. 修改 <VC2005>/VC/VCProjectDefaults/corewin_express.vsprops,将
AdditionalDependencies="kernel32.lib"
修改为
AdditionalDependencies="kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib"
4. 重启VC++再次编译解决上述问题;
5. VC2005安装时还会有一些其它的设置问题,可以参照: http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk - class 2: rc.exe error;
http://www.apachelounge.com/forum/viewtopic.php?p=6315给出了解决方法:
导致这种错误的原因是Resource Preprocessor Definitions 中定义了VC++无法识别的字符。在所有报错的工程中点击Properties->Configuration Properties->Resources->General->Preprocessor Definitions去掉双引号、将字符串中的空格去掉,比如
修改前:LONG_NAME="Apache HTTP Server Core"
修改后:LONG_NAME=ApacheHTTPServerCore - class 3:copy error;
奇怪的是解决了class2的错误之后,这个错误也随之不见了:)