在Visual Studio 2017中构建TclTk时出错

时间:2018-02-01 09:28:34

标签: visual-studio-2017 tcl

我在使用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

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:3)

vcvarsall x64 10.0.15063.0 

设置64位构建环境(x86代表32位)。

参考:http://wiki.tcl.tk/54819

答案 1 :(得分:3)

原因是tk/xlib/X11/X.h定义了宏NoneControlMask。这些单词恰好在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