Ошибка при сборке 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

Другие вопросы по тегам