我在使用Visual Studio 2017(15.5.x)编译Tcl / Tk时遇到麻烦。我可以编译从2010年到2013年的代码。
使用msvc 2017编译tkStubLib.c文件时出现以下错误
C:\Program Files (x86)\Windows Kits\10\include\10.0.16299.0\um\winnt.h(20062): error C2059: syntax error: 'constant'
我尝试过TclTk 8.6.0和8.6.8
有人可以帮助我吗?
答案 0 :(得分:3)
答案 1 :(得分:3)
原因是tk/xlib/X11/X.h
定义了宏None
和ControlMask
。这些单词恰好在Windows SDK标头中使用,因为SDK 10.0.16299.0
作为标识符。因此,如果<windows.h>
在X.h
之后(或任何包含它的标题,一直到tk.h
之后)被#include替换,则会破坏这些标题。
已在Tk Source Code: Tk does not build under Visual Studio 2017 Update 5下报告了此情况。
最简单的解决方法是在Tk代码库中搜索并重命名这些宏-例如到None_
和ControlMask_
:
$ find ! \( -path './.git/*' -o -type d \) -a \( -name '*.c' -o -name '*.h' \) -print0 |\
xargs -0 python -c '
import sys,re
for fname in sys.argv[1:]:
with open(fname,"rb") as f: l=f.read()
(r,n)=re.subn(r"\b(None|ControlMask)\b",r"\1_",l)
if n>0:
with open(fname,"wb") as f: f.write(r)
'
这将使生成的Tk头与普通头不兼容。虽然仅在您需要根据Tk C接口编译其他程序时才重要。此外,您可以将它们重命名为buildall.vc.bat install
生成的树。
答案 2 :(得分:1)
我遇到了同样的问题。使用较旧的SDK版本可能不是最佳答案。如果您对更强大的解决方案感兴趣,可以阅读我的回答here。
答案 3 :(得分:0)
最简单的解决方法是将#include <windows.h>
添加到tk/xlib/X11/X.h
。
这样可以确保windows.h
被包含在X.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