vc2005
比较稳的做法是,更改自定义生成步中的Command Line为:
if not exist $(OutDir) md $(OutDir)
"mc.exe" -h $(OutDir) -r $(OutDir) $(SolutionDir)NTEventLogCategories.mc
"RC.exe" -r -fo $(OutDir)/$(InputName).res $(ProjectDir)/$(InputName).rc
"link.exe" /MACHINE:IX86 -dll -noentry -out:$(OutDir)/NTEventLogAppender.dll $(OutDir)/$(InputName).res
Outputs填写:$(OutDir)/NTEventLogAppender.dll
log4cpp
工程是静态链接库,log4cppDLL
是动态链接库;log4cpp
只有MS vc6
的工程文件。但使用vs2003
将dsp
转换成vcproj
之后编译的过程中会出现错误,
问题一:
报错error PRJ0019:
工具从"
正在执行自定义生成步骤"
,详细可以查看其BuildLog.htm
。
解决办法,将转换后的vcproj
打开,需要手工修改,原来的倒数几行的如下内容,使用了错误的可执行文件路径和错误的双引号,请注意,有的人说需要把NTEventLogCategories.mc
这个文件删掉,我在我的机子上验证了下,那个文件不能删,并且需要把下面的内容替换替换为后面的内容:
<FileConfiguration Name="Debug|Win32">
<Tool Name="VCCustomBuildTool" CommandLine="if not exist $(OutDir) md $(OutDir)
"$(DevEnvDir)../Tools/Bin/mc.exe" -h $(OutDir) -r $(OutDir) $(ProjectDir)../$(InputName).mc
"$(DevEnvDir)../../vc7/Bin/RC.exe" -r -fo $(OutDir)/$(InputName).res $(OutDir)/$(InputName).rc
"$(DevEnvDir)../../VC7/Bin/link.exe" /MACHINE:IX86 -dll -noentry -out:$(OutDir)/NTEventLogAppender.dll $(OutDir)/$(InputName).res"
Outputs="$(OutDir)/NTEventLogAppender.dll"/>
</FileConfiguration>
<FileConfiguration Name="Release|Win32">
<Tool Name="VCCustomBuildTool" CommandLine="if not exist $(OutDir) md $(OutDir)
"$(DevEnvDir)../Tools/Bin/mc.exe" -h $(OutDir) -r $(OutDir) $(ProjectDir)../$(InputName).mc
"$(DevEnvDir)../../vc7/Bin/RC.exe" -r -fo $(OutDir)/$(InputName).res $(OutDir)/$(InputName).rc
"$(DevEnvDir)../../VC7/Bin/link.exe" /MACHINE:IX86 -dll -noentry -out:$(OutDir)/NTEventLogAppender.dll $(OutDir)/$(InputName).res"
Outputs="$(OutDir)/NTEventLogAppender.dll"/>
</FileConfiguration>
替换为:
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCustomBuildTool"
CommandLine="if not exist "$(OutDir)" md "$(OutDir)"
"$(DevEnvDir)../../VC98/Bin/mc.exe" -h "$(OutDir)" -r "$(OutDir)" "$(ProjectDir)"../"$(InputName)".mc
"$(DevEnvDir)Bin/RC.exe" -r -fo "$(OutDir)"/"$(InputName)".res "$(OutDir)"/"$(InputName)".rc
"$(DevEnvDir)../../VC98/Bin/link.exe" /MACHINE:IX86 -dll -noentry -out:"$(OutDir)"/NTEventLogAppender.dll "$(OutDir)"/"$(InputName)".res
"
Outputs="$(OutDir)/NTEventLogAppender.dll"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCustomBuildTool"
CommandLine="if not exist "$(OutDir)" md "$(OutDir)"
"$(DevEnvDir)../../VC98/Bin/mc.exe" -h "$(OutDir)" -r "$(OutDir)" "$(ProjectDir)"../"$(InputName)".mc
"$(DevEnvDir)Bin/RC.exe" -r -fo "$(OutDir)"/"$(InputName)".res "$(OutDir)"/"$(InputName)".rc
"$(DevEnvDir)../../VC98/Bin/link.exe" /MACHINE:IX86 -dll -noentry -out:"$(OutDir)"/NTEventLogAppender.dll "$(OutDir)"/"$(InputName)".res
"
Outputs="$(OutDir)/NTEventLogAppender.dll"/>
</FileConfiguration>
问题二:
问题:log4cppDLL 项目编译时会报8 个连接错误,提示符号std::_Tree 找不到
解决方案:
将include/log4cpp/FactoryParams.hh 文件中的
const_iterator find(const std::string& t) const;
修改为
const_iterator find(const std::string& t) const { return storage_.find(t); }
后重新编译
问题三:
问题: log4cppDLL 项目编译时会报 1 个连接错误,提示符号 log4cpp::localtime 找不到
解决方案:
将 src/localtime.cpp 文件添加到项目中重新编译
问题四:
问题: log4cppDLL 项目编译时 找不到 localtime_s 找不到符号
解决方案:因为 VS 版本低,所以头文件 time.h 里面没有这个函数,打开 src 里面的文件 Localtime.cpp ,
修改为 localtime_s(t, time); 为
::tm * tmp = ::localtime (time );
memcpy
(t
, tmp
, sizeof
(::tm
));
编译则通过;
问题五:
问题:编译testPattern
工程时,提示找不到
localtime
符号
解决方案:log4cpp
项目编译时,把src/localtime.cpp
文件添加到项目的Source Files中
;
把src/localtime.hh文件添加到项目的Header Files中重新编译;
log4cpp 应用手册
1 下载 log4cpp 并解压。
2 打开 /log4cpp-0.3.4b/msvc6/msvc6.dsw
编译 log4cpp 工程 Release 版。
3 将编译后的 log4cpp.lib 复制到 VC 的 Lib 目录中。
4 将头文件的目录 log4cpp-0.3.4b/include/log4cpp/
复制到 VC 的 Include 目录 .
( 或者添加 log4cpp-0.3.4b/include 到 VC 的 Include 环境变量 )
6 目标工程包含库
log4cpp.lib ws2_32.lib
(要选择库连接方式相同的库)