在VS2017环境下的编译
log4cpp-1.1.3并未提供VS2017的项目工程,但是我们可以从msvc10版本中升级。
复制msvc10目录并重命名为msvc2017。
用VS2017打开解决方法msvc10.sln,并按提示执行升级过程。
把Solution Name重命名为msvc2017
尝试编译log4cpp的Win32 Debug配置,将出现如下错误。
1>------ Build started: Project: log4cpp, Configuration: Debug Win32 ------ 1>Performing Custom Build Tools 1>'"vsvars32.bat"' 不是内部或外部命令,也不是可运行的程序 1>或批处理文件。 1>D:\log4cpp\msvc2017\log4cpp\..\NTEventLogCategories.mc : error : unable to open output file - Debug" -r Debug"\NTEventLogCategories.h 1>MC: Unable to open D:\log4cpp\msvc2017\log4cpp\..\NTEventLogCategories.mc for input 1>Microsoft (R) Windows (R) Resource Compiler Version 10.0.10011.16384 1> 1>Copyright (C) Microsoft Corporation. All rights reserved. 1> 1> 1>CUSTOMBUILD : fatal error RC1110: could not open Debug\NTEventLogCategories.rc 1> 1>Microsoft (R) Incremental Linker Version 14.11.25547.0 1>Copyright (C) Microsoft Corporation. All rights reserved. 1> 1>LINK : fatal error LNK1181: cannot open input file 'Debug\NTEventLogCategories.res' 1>Done building project "log4cpp.vcxproj" -- FAILED. ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== |
解决方案:
在log4cpp项目中找到NTEventLogCategories.mc文件,打开属性页,定位到“Custom Build Tools“ à”General“ à ”Command Line“,如下图所示:
这一行代码实际是由多行语句组成,经过“断行“处理后,Command Line的内容如下:
"$(VS100COMNTOOLS)vsvars32.bat" if not exist $(OutDir) md $(OutDir) mc.exe -h "$(OutDir)" -r "$(OutDir)" "$(ProjectDir)..\%(Filename).mc" rc.exe -r -fo "$(OutDir)%(Filename).res" "$(OutDir)%(Filename).rc" link.exe /MACHINE:IX86 -dll -noentry -out:"$(OutDir)NTEventLogAppender.dll" "$(OutDir)%(Filename).res" |
删除第一行"$(VS100COMNTOOLS)vsvars32.bat" 。
关键:在第3条命令mc.exe中的两处"$(OutDir)",改为"$(OutDir)\",(即在后面多加一个\符号)。
可选:
l 第二行也是多余的,可以删除。因为在VS2017环境下,预定义的$(IntDir)与$(OutDir)目录在编译时都会自动创建。
l 把第3条命令mc.exe中的"$(ProjectDir)..\%(Filename).mc"改为"%(FullPath)"。
l 把所有$(OutDir)改为$(IntDir),除了第4条命令-out参数中的$(OutDir)保留外。这样可以减少$(OutDir)目录下的“垃圾”文件。
修改后的内容如下:
mc.exe -h "$(IntDir)\" -r "$(IntDir)\" "%(FullPath)" rc.exe -r -fo "$(IntDir)%(Filename).res" "$(IntDir)%(Filename).rc" link.exe /MACHINE:IX86 -dll -noentry -out:"$(OutDir)NTEventLogAppender.dll" "$(IntDir)%(Filename).res" |
重新编译,上面的问题没了,但又出现了另一个错误。错误信息如下:
1>snprintf.c 1>d:\log4cpp\src\snprintf.c(524): error C2084: function 'int snprintf(char *const ,const ::size_t,const char *const ,...)' already has a body 1>c:\program files (x86)\windows kits\10\include\10.0.16299.0\ucrt\stdio.h(1938): note: see previous definition of 'snprintf' 1>d:\log4cpp\src\snprintf.c(538): error C2084: function 'int vsnprintf(char *const ,const ::size_t,const char *const ,va_list)' already has a body |
解决方案一:
在log4cpp项目中找到snprintf.c文件,在编辑器中打开它,并定位到195行,找到有(/* #define HAVE_SNPRINTF */)字样,去掉该位的注释/**/符号。
#if defined(_MSC_VER) && _MSC_VER >= 1500 #define HAVE_SNPRINTF #endif |
重新编译,问题解决。
解决方案二:
在项目设置的Preprocessor Definitions项加入HAVE_SNPRINTF预处理宏定义。
以上修改后虽然可以成功编译,便仍会有C4996、C4275、C4244这三个编译警告,追求完美的可以进一步修改。方案如下:
在log4cpp项目中找到config-win32.h文件,在编辑器中打开它,并在文件末尾(#endif语句的前面)加入以下语句:
#if defined(_MSC_VER) #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable: 4996) #pragma warning(disable: 4275) #pragma warning(disable: 4244) #endif |
重新编译便不再会有警告了。
用同样的方法可以修正Release版本或静态库版本。
生成Windows x64架构的版本
以上面已修正好后的VS2017环境为基础,我们创建一个x64架构的编译版本。
打开log4cpp项目的Configuration Manager配置页,在Active solution platform项中选择<New…>,
弹出New Solution Platform对话框,在Type or select new platform项选择x64(如下图所示),然后点击OK按钮。
在log4cpp项目中找到NTEventLogCategories.mc文件,打开属性页,定位到“Custom Build Tools“ à ”General“ à ”Command Line“,修改内容,把最后一行的/MACHINE:IX86改为/MACHINE:X64。
保存后重新编译即可。
用同样的方法可以修正Release版本或静态库版本。