环境准备
开发环境Windows
开发工具Visual Studio 2019
依赖的库:
- apr-1.7.0-win32-src.zip
- apr-iconv-1.2.2-win32-src.zip
- apr-util-1.6.1-win32-src.zip
- expat-win32bin-2.2.9.exe
准备工作:
将apr、apr-iconv、apr-util解压,并将文件夹重命名将版本号去掉,如下图所示:
执行expat安装程序,安装完成后,目录结构如下所示:
Bin目录下包含编译已经编译好的.lib静态库和.dll动态库,Source目录下包含Expat的源码。
编译
首先进入apr-util文件夹下,使用vs2019打开aprutil.dsw文件,如下图所示:
点击确定按钮。
需要按照如下步骤进行编译:
- apr
- apriconv
- aprutil
- libapr
- libapriconv
- libaprutil
我们使用vs直接编译libaprutil即可,编译器会自动按照顺序编译完成。我们将工具栏的Debug改为Release、x86。属性的配置面板也改为Release。如下图所示:
配置,编译时会出现如下错误:
解决办法:在apr\include文件夹下找到apr.hw文件,以文本方式打开,找到宏定义“#define _WIN32_WINNT 0x0501”,将0x0501改为0x0600。
再次编译libaprutil,会出现如下错误:
这是由于我们没有配置expat的include头文件以及静态库。
首先将expat的头文件引进来,按照下图步骤配置:
然后我们将expat的静态库引进来,如下图所示:
第一步:
第二步:
至此配置完成,我们再次进行编译,编译成功。
在各个文件夹下的Release目录下可以找到编译后产生的库。
在编译过程中可能会出现“找不到apr_escape_test_char.h头文件”错误,解决方法,可以自己新建一个头文件,内容如下:
/* this file is automatically generated by gen_test_char, do not edit. "make include/private/apr_escape_test_char.h" to regenerate. */
#define T_ESCAPE_SHELL_CMD (1)
#define T_ESCAPE_PATH_SEGMENT (2)
#define T_OS_ESCAPE_PATH (4)
#define T_ESCAPE_ECHO (8)
#define T_ESCAPE_URLENCODED (16)
#define T_ESCAPE_XML (32)
#define T_ESCAPE_LDAP_DN (64)
#define T_ESCAPE_LDAP_FILTER (128)
static const unsigned char test_char_table[256] = {
224,222,222,222,222,222,222,222,222,222,223,222,222,223,222,222,222,222,222,222,
222,222,222,222,222,222,222,222,222,222,222,222,6,16,127,22,17,23,49,17,
145,145,129,80,80,0,0,18,0,0,0,0,0,0,0,0,0,0,16,87,
119,16,119,23,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,23,223,23,23,0,23,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,23,23,23,17,222,222,222,222,222,222,222,222,222,222,222,222,222,
222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,
222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222
};
最后,如果编译不通过,还是报错,根据错误找到原因,依次解决。