Visual studio 2017 在Visual Studio 2017中构建TclTk时出错

Visual studio 2017 在Visual Studio 2017中构建TclTk时出错,visual-studio-2017,tcl,Visual Studio 2017,Tcl,我很难用Visual Studio 2017(15.5.x)编译Tcl/Tk。我可以从2010年到2013年编译代码 我在使用msvc 2017编译tkStubLib.c文件时遇到以下错误 C:\ProgramFiles(x86)\Windows工具包\10\include\10.0.16299.0\um\winnt.h(20062):错误C2059:语法错误:“常量” 我试过TclTk 8.6.0和8.6.8 有人能帮我吗 vcvarsall x64 10.0.15063.0 设置64位生

我很难用Visual Studio 2017(15.5.x)编译Tcl/Tk。我可以从2010年到2013年编译代码

我在使用msvc 2017编译tkStubLib.c文件时遇到以下错误

C:\ProgramFiles(x86)\Windows工具包\10\include\10.0.16299.0\um\winnt.h(20062):错误C2059:语法错误:“常量”

我试过TclTk 8.6.0和8.6.8

有人能帮我吗

vcvarsall x64 10.0.15063.0 
设置64位生成环境(x86用于32位)


参考资料:

原因是
tk/xlib/X11/X.h
定义了宏
None
ControlMask
。由于SDK
10.0.16299.0
作为标识符,所以这些词恰好在Windows SDK标题中使用。因此,如果
X.h
之后(或任何包含它的头,一直到
tk.h
)得到“include”,它们就会被替换,破坏这些头

这已在下一节中报告


最简单的修复方法是在Tk代码库中搜索并重命名这些宏,例如,搜索到
None\u
ControlMask\u

$find\(-path'/.git/*'-o-type d\)-a\(-name'*.c'-o-name'*.h'\)-print0|\
xargs-0python-c'
导入系统,re
对于sys.argv[1:]中的fname:
用open(fname,“rb”)表示f:l=f.read()
(r,n)=re.subn(r“\b(无控制掩码)\b”,r“\1”,l)
如果n>0:
用open(fname,“wb”)作为f:f.write(r)
'

这将使生成的Tk头与正常头不兼容。不过,只有当您有其他需要针对TKC接口编译的程序时,它才起作用。此外,您可以在树中重新命名它们,因为
buildall.vc.bat安装

我遇到了相同的问题。使用较旧的SDK版本可能不是最好的答案。如果您对更强大的解决方案感兴趣,可以阅读我的答案。

最简单的解决方案是将
#include
添加到
tk/xlib/X11/X.h
。 这样可以确保在
X.h
之前包含
windows.h

/*
 *  $XConsortium: X.h,v 1.66 88/09/06 15:55:56 jim Exp $
 */

/* Definitions for the X window system likely to be used by applications */

#ifndef X_H
#define X_H
/* patched, include "windows.h" first to avoid conflict macro */
#ifdef _WIN32
#   define WIN32_LEAN_AND_MEAN
#   include <windows.h>
#   undef WIN32_LEAN_AND_MEAN
#endif

/*
*$XConsortium:X.h,v1.66 88/09/06 15:55:56吉姆经验$
*/
/*应用程序可能使用的X窗口系统的定义*/
#ifndef X_H
#定义X_H
/*已修补,首先包括“windows.h”以避免宏冲突*/
#ifdef_WIN32
#定义WIN32_精益_和_平均值
#包括
#未定义WIN32\u精益\u和\u平均值
#恩迪夫

Tcl和Tk源代码发行版不提供该文件。它只是在构建
tcl/win/tclWinInit.c
时作为一个显式依赖项提到的,我们也从来没有将常量定义为任何东西。我无法进一步探究;我根本没有安装Windows构建系统。看起来相关,但我不知道它是否是重复的。和。不知道为什么修复没有进入8.6.8。谢谢您的回答。这是一个有趣的问题。有人知道我是否可以在不同的库中混合windows sdk,例如,当一个库使用win sdk v1,另一个库使用lib one和win sdk v2时?因为现在使用vcvarsall win sdk会更容易,这就像一种魅力。事实上,被接受的答案对我来说并不适用。显然,即使在将Tcl&Tk版本从8.6.8更改为8.6.9甚至8.7.a1之后,错误仍然存在。替换宏后,tk编译。