Ошибка при сборке TclTk в Visual Studio 2017
У меня проблемы с компиляцией Tcl/Tk с Visual Studio 2017 (15.5.x). Я могу скомпилировать код с 2010 по 2013 год.
Я получаю следующую ошибку при компиляции файла tkStubLib.c с msvc 2017
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
Кто-нибудь может мне помочь?
5 ответов
vcvarsall x64 10.0.15063.0
настроить 64-битную среду сборки (x86 для 32-битной).
Ссылка: http://wiki.tcl.tk/54819
Причина в том, что tk/xlib/X11/X.h
определяет макросы None
а также ControlMask
, И эти слова просто используются в заголовках Windows SDK, так как SDK 10.0.16299.0
в качестве идентификаторов. Таким образом, они заменяются, ломая эти заголовки, если <windows.h>
получает # include'd после X.h
(или любые заголовки, которые включают его, вплоть до tk.h
).
Об этом сообщается в разделе Исходный код 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
,
Я столкнулся с такими же проблемами. Использование более старой версии SDK может быть не лучшим решением. Если вы заинтересованы в более надежном решении, вы можете прочитать мой ответ здесь.
Была эта проблема, но оказалось, что моя причина была ошибкой нуба.
Не впишите случайно эту строку в свой собственный код:
#define X
Это испортит библиотеки VC.
Самое простое решение - добавить #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