Visual studio 2017 在Visual Studio 2017中构建TclTk时出错
我很难用Visual Studio 2017(15.5.x)编译Tcl/Tk。我可以从2010年到2013年编译代码 我在使用msvc 2017编译tkStubLib.c文件时遇到以下错误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位生
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
。由于SDK10.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编译。