用 VC6 编译 log4cplus + stlport

来源:互联网 发布:下载农村淘宝家乡版 编辑:程序博客网 时间:2024/05/06 06:43

log4cplus的较新版本(1.1, 1.04)不直接支持使用VC6编译(仅支持VC10,VC8),所以我们只能用2009年发布的较旧的1.03版本,这个版本自带了VC6的工程文件(*.dsw),可直接用VC6编译。但如果把 log4cplus 和 stlport 一起编译的话,会遇到大概20个编译错误。这些错误多数算是 stlport 导致的,但出于方便起见我们通过修改 log4cplus 的源代码解决,需要修改的地方如下:

文件 configurator.cxx 中 remove_copy_if 改为 std::remove_copy_if;

文件 factory.cxx 中 reg.put (std::auto_ptr<typename Reg::product_type> (new Fac)) 删除 typename ;

文件 fileappender.cxx 中 std::rename 改为 rename,std::remove 改为 remove;

文件 property.cxx 中 std::isspace 改为 isspace;

文件 socketbuffer.cxx 中多处 std::memcpy 全部改为 memcpy;

文件 socket-win32.cxx 中在class WinSockInitializer内部开头加入 public: 关键字;

文件 socket-win32.cxx 中 LONG val = ::InterlockedCompareExchange (&winsock_state, WS_INITIALIZING, WS_UNINITIALIZED); 修改为 LONG val = (LONG)::InterlockedCompareExchange ((void**)&winsock_state, (void*)WS_INITIALIZING, WS_UNINITIALIZED);,无非是加上强制类型转换,共有3处。

另外,项目 log4cplus_static.dsp 里面不应该有文件 loggingserver.cxx,需从项目中移除;文件 win32debugappender.cxx 应该添加到项目中。如果想静态链接stlport库,在项目预编译设置里添加宏定义_STLP_USE_STATIC_LIB。

其实都是很简单的语法错误,很容易解决。修改以上代码后,编译 log4cplus_static.dsp 即可生成 log4cplus 的静态库 log4cplusS.lib。欲静态链接log4cplus库的应用程序应定义宏LOG4CPLUS_STATIC。

此外,Liigo建议在项目预编译设置里添加宏定义 WINVER=0x0410,已避免链接stlport库时可能出现的以下链接错误:找不到符号 _building_for_windows95_but_library_built_for_at_least_windows98。这是因为VC6实在太旧了,它自带的Windows.h里定义的WINVER值为0x0400(代表Win95)太小,而stlport编译时默认指定的WINVER为0x0501(代表WinXP),stlport发现两者不一致因而报错(参见stlport\stl\config\_windows.h)。虽然VC6很旧了,但我们运行VC6的电脑系统版本都远高于Win95,所以把WINVER改大一点问题不大(0x0410代表Win98)。当然,如果你没有遇到如上链接错误,则没必要做此改动。(从上面这些乱七八糟的事情判断,stlport还是不太友好啊,让人用的头疼。说到底还是VC6的STL不争气,以至于我们不得不用stlport。)

最近我(Liigo)有一点感受,发现能直接用VC6编译的C/C++库越来越少,好不容易找到一个都算是万幸了,不知道是C++越来越高级了,还是VC6越来越落后了。

附 log4cplus 1.03 下载地址:

http://sourceforge.net/projects/log4cplus/files/log4cplus-stable/1.0.3/

附送一个最简单的log4cplus使用示例,可用作验证其是否运作正常:

#include <log4cplus/logger.h>#include <log4cplus/consoleappender.h>#include <log4cplus/helpers/pointer.h>using namespace log4cplus;using namespace log4cplus::helpers;int main(int argc, char* argv[]){SharedObjectPtr<Appender> appender1(new ConsoleAppender());Logger logger = Logger::getInstance(LOG4CPLUS_TEXT("main"));logger.addAppender(appender1);LOG4CPLUS_WARN(logger, LOG4CPLUS_TEXT("Hello, World!"));return 0;}