log4cxx vs2013编译
1.下载源码
http://mirror.bit.edu.cn/apache/apr/apr-1.6.5-win32-src.zip
http://mirror.bit.edu.cn/apache/apr/apr-util-1.2.10-win32-src.zip
http://mirror.bit.edu.cn/apache/logging/log4cxx/0.10.0/apache-log4cxx-0.10.0.zip
2.文件处理
(1)将三个压缩包解压到同一个目录,apr-1.6.5改名为apr,apr-util-1.2.10改名为apr-util。
进入apr-util\include修改apr_ldap.hw的APR_HAS_LDAP宏定义为0,apu.hw的APU_HAVE_APR_ICONV宏定义为0。如果此处宏定义没有修改会出现一些“LNK2019”的错误:
error LNK2019: unresolved external symbol _apr_iconv_open@16 referenced in function _apr_xlate_open@16
error LNK2019: unresolved external symbol _apr_iconv_close@8 referenced in function _apr_xlate_cleanup
error LNK2019: unresolved external symbol _apr_iconv@24 referenced in function _check_sbcs
(2)进入apache-log4cxx-0.10.0执行configure.bat,进入projects.
(3)vs2013打开log4cxx.dsw,升级工程,打开项目的顺序不能出错,否则会出现项目文件损坏的问题。
(4)修改log4cxx.vcxproj项目属性,在链接器->输入中添加Rpcrt4.lib;未添加该.lib文件会出现“LNK2019”报错:
error LNK2019 无法解析的外部符号 __imp__UuidCreate@4,该符号在函数 _apr_os_uuid_get@4 中被引用 log4cxx
(5)log4cxx\apr\include中添加一个文件: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. */
//编译 apr 1.6.5 需要的头文件 apr_escape_test_char.h
#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
};
缺失该头文件会报一些符号未定义的error。
(6)打开 apr/apr.vcxproj删除以下内容:
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">cl.exe /nologo /W3 /EHsc /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /I ".\include" /Fo.\x64\Debug\gen_test_char /Fe.\x64\Debug\gen_test_char.exe .\tools\gen_test_char.c
.\x64\Debug\gen_test_char.exe > .\include\apr_escape_test_char.h</Command>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Creating gen_test_char.exe and apr_escape_test_char.h</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\include\apr_escape_test_char.h;.\include\apr_escape_test_char.h;.\include\apr_escape_test_char.h;.\include\apr_escape_test_char.h;%(Outputs)</Outputs>
(7)修改src\main\cpp\stringhelper.cpp文件,包含头文件“#include ”。
(8)修改src\main\include\log4cxx\log4cxx.h文件:
//原来
#if defined(LOG4CXX_STATIC)
#define LOG4CXX_EXPORT
//改为
#if defined(LOG4CXX_STATIC) || (defined(_MSC_VER) && _MSC_VER >= 1900)
#define LOG4CXX_EXPORT
//原来
#if defined(_MSC_VER) && !defined(LOG4CXX_STATIC) && defined(LOG4CXX)
//改为
#if defined(_MSC_VER) && _MSC_VER < 1900 && !defined(LOG4CXX_STATIC) && defined(LOG4CXX)
//原来
#elif defined(_MSC_VER) && !defined(LOG4CXX_STATIC)
//改为
#elif defined(_MSC_VER) && _MSC_VER < 1900 && !defined(LOG4CXX_STATIC)
3.编译生成.dll和.lib
修改完成后即分别在release和debug下先编译除log4cxx之外的三个项目,最后编译log4cxx。
编译过程中的一些报错可google关键字查找到有用信息,参考相关经验帖即可解决大部分问题。
补充:
vs2019编译若出现:error C2252: 只能在命名空间范围内显式实例化模板,参考以下修改:
请双击 "输出" 窗口中的错误行, 此时会在 "代码窗口" 中出现错误的位置.
选择 LOG4CXX_LIST_DEF, 按键盘 F12, 此时会跳转到该宏的定义将
#define LOG4CXX_LIST_DEF(N, T) \
template class LOG4CXX_EXPORT std::allocator<T>; \
template class LOG4CXX_EXPORT std::vector<T>; \
typedef std::vector<T> N
替换为:
#define LOG4CXX_LIST_DEF(N, T) \
typedef std::vector<T> N
若出现:LNK2019 无法解析的外部符号 __imp__UuidCreate@4,该符号在函数 _apr_os_uuid_get@4 中被引用……
测试发现在apr中屏蔽内部的UuidCreate则通过。
//注释以下代码
if (FAILED(UuidCreate((UUID *)uuid_data))) {
return APR_EGENERAL;
}
最后, 链接器->输入->附加依赖项:增加Rpcrt4.lib,最后通过。