log4cxx vs2013编译

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 &gt; .\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,最后通过。

参考:log4cxx vs2017编译

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值