在 Visual Studio 2017 中构建 TclTk 时出现错误

3
我遇到了在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:语法错误:“constant” 我尝试使用TclTk 8.6.0和8.6.8。 有人能帮帮我吗?

Tcl和Tk源代码分发不提供该文件。只有在构建tcl/win/tclWinInit.c时,它才被明确地作为依赖项提到,我们也从未将#define constant定义为任何内容。我无法进一步探测;我根本没有设置Windows构建系统。 - Donal Fellows
这个看起来很相关,但我无法确定它是否是一个重复的问题。 - Donal Fellows
1
https://groups.google.com/d/msg/comp.lang.tcl/2u1UopML7h0/UWA00xhCAAAJ 和 https://core.tcl.tk/tk/tktview?name=3d34589aa0 。不确定为什么修复程序没有被纳入8.6.8版本。 - Brad Lanam
谢谢你的回答。这是一个有趣的问题。有人知道我是否可以混合使用不同库中的Windows SDK,例如当一个库使用win SDK v1,而另一个库使用使用win SDK v2的库时?因为目前在vcvarsall中使用能够工作的win SDK会更容易些。 - Michael Aigner
5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
3
原因在于tk/xlib/X11/X.h定义了宏NoneControlMask。由于自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生成的目录中将它们改回原名。


这个非常好用。事实上,被接受的答案对我并没有起作用。显然,即使将Tcl&Tk版本从8.6.8更改为8.6.9甚至8.7.a1,错误仍然存在。替换宏后,tk编译成功了。 - Duck Dodgers

3
vcvarsall x64 10.0.15063.0 

建立一个64位的构建环境(32位的x86)。

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


1

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


0
最简单的解决方法是在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


0

我曾经遇到过这个问题,但后来发现原因是一个新手错误。

不要意外地将这行代码写入你自己的程序中:

#define X

它会搞乱VC库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,