C++—在VS2017环境下的编译log4cpp

在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“,如下图所示:

C++—在VS2017环境下的编译log4cpp_第1张图片

这一行代码实际是由多行语句组成,经过“断行“处理后,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预处理宏定义。

C++—在VS2017环境下的编译log4cpp_第2张图片

 

以上修改后虽然可以成功编译,便仍会有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项中选择

C++—在VS2017环境下的编译log4cpp_第3张图片

弹出New Solution Platform对话框,在Type or select new platform项选择x64(如下图所示),然后点击OK按钮。

C++—在VS2017环境下的编译log4cpp_第4张图片

在log4cpp项目中找到NTEventLogCategories.mc文件,打开属性页,定位到“Custom Build Tools“ à ”General“ à ”Command Line“,修改内容,把最后一行的/MACHINE:IX86改为/MACHINE:X64。

 

C++—在VS2017环境下的编译log4cpp_第5张图片

保存后重新编译即可。

    用同样的方法可以修正Release版本或静态库版本。

你可能感兴趣的:(C++)