tk/xlib/X11/X.h
定义了宏None
和ControlMask
。由于自SDK 10.0.16299.0
以来,这些词正好被用作Windows SDK头文件中的标识符。因此,如果在X.h
(或任何包含它的头文件,一直到tk.h
)之后#include ,则它们将被替换,破坏那些头文件。
这已经在Tk源代码:Tk在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
生成的目录中将它们改回原名。
tk/xlib/X11/X.h
中添加#include <windows.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
我曾经遇到过这个问题,但后来发现原因是一个新手错误。
不要意外地将这行代码写入你自己的程序中:
#define X
它会搞乱VC库。
tcl/win/tclWinInit.c
时,它才被明确地作为依赖项提到,我们也从未将#define constant
定义为任何内容。我无法进一步探测;我根本没有设置Windows构建系统。 - Donal Fellows