При использовании hsc2hs введение директивы #include в исходный код haskell приводит к многочисленным ошибкам.
Я пишу программу на Haskell, которая должна знать некоторые подробности о состоянии X11, поэтому я пытаюсь определить FFI, который будет вызывать соответствующие символы общих библиотек X11. Я обычно следую инструкциям из викибука. Когда я добавляю include
директива, которая относится к официальному заголовку X11, hsc2hs
бросает на меня кучу ошибок, как будто указанный заголовок синтаксически неверен. Мне пришлось прибегнуть к написанию собственного заголовка, который, по сути, копирует нужные мне биты из файла заголовка восходящего потока и который позволяет компилировать мой код.
Конкретно мне нужно _XkbRF_VarDefs
что заявлено в X11/extensions/XKBrules.h
, Вы можете просмотреть мой код в репозитории: commit 4d77785 содержит заголовок, который мне пришлось написать для его компиляции, в то время как в 8d5e76c вы найдете мои последние сообщения с официальным заголовком, который не компилируется (вы можете увидеть журнал ошибок ниже),
Это официальный заголовок, который сломан? Либо это hsc2hs
? Есть ли какие-нибудь волшебные флаги, которые мне нужно добавить к hsc2hs
вызов в моем скрипте make, чтобы он компилировался с официальным заголовком?
Журнал ошибок:
In file included from ShowKeyboardLayout.hsc:17:0:
/usr/include/X11/extensions/XKBrules.h:106:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘extern’
extern Bool XkbRF_GetComponents(
^~~~~~
/usr/include/X11/extensions/XKBrules.h:106:8: error: unknown type name ‘Bool’
extern Bool XkbRF_GetComponents(
^~~~
/usr/include/X11/extensions/XKBrules.h:118:8: error: unknown type name ‘Bool’
extern Bool XkbRF_LoadRules(
^~~~
/usr/include/X11/extensions/XKBrules.h:119:5: error: unknown type name ‘FILE’
FILE * /* file */,
^~~~
/usr/include/X11/extensions/XKBrules.h:123:8: error: unknown type name ‘Bool’
extern Bool XkbRF_LoadRulesByName(
^~~~
/usr/include/X11/extensions/XKBrules.h:145:8: error: unknown type name ‘Bool’
extern Bool XkbRF_LoadDescriptions(
^~~~
/usr/include/X11/extensions/XKBrules.h:146:5: error: unknown type name ‘FILE’
FILE * /* file */,
^~~~
/usr/include/X11/extensions/XKBrules.h:150:8: error: unknown type name ‘Bool’
extern Bool XkbRF_LoadDescriptionsByName(
^~~~
/usr/include/X11/extensions/XKBrules.h:159:5: error: unknown type name ‘Bool’
Bool /* wantDesc */,
^~~~
/usr/include/X11/extensions/XKBrules.h:160:5: error: unknown type name ‘Bool’
Bool /* wantRules */
^~~~
/usr/include/X11/extensions/XKBrules.h:172:5: error: unknown type name ‘Bool’
Bool /* freeRules */
^~~~
/usr/include/X11/extensions/XKBrules.h:182:8: error: unknown type name ‘Bool’
extern Bool XkbRF_GetNamesProp(
^~~~
/usr/include/X11/extensions/XKBrules.h:183:4: error: unknown type name ‘Display’
Display * /* dpy */,
^~~~~~~
/usr/include/X11/extensions/XKBrules.h:188:8: error: unknown type name ‘Bool’
extern Bool XkbRF_SetNamesProp(
^~~~
/usr/include/X11/extensions/XKBrules.h:189:4: error: unknown type name ‘Display’
Display * /* dpy */,
^~~~~~~
ShowKeyboardLayout.hsc:19:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘int’
type Display = Int -- cz idk
^~~
compiling ./ShowKeyboardLayout_hsc_make.c failed (exit code 1)
command was: /usr/bin/gcc -c ./ShowKeyboardLayout_hsc_make.c -o ./ShowKeyboardLayout_hsc_make.o -fno-stack-protector -I/usr/lib/ghc-8.0.1/include/
PS В комментариях замечено, что XKBrules.h
нет в инсталляции Ubuntu. Я использую Arch Linux, и этот файл находится в пакете extra / libxkbfile, который, помимо прочего, является зависимым от gnome-desktop, xorg-setxkbmap и xterm.
1 ответ
Исследование содержимого файла XKBrules.h показывает, что оно предназначено для программ на C++, а не для программ на C
эта веб-страница дает дополнительную информацию:
http://xmonad.org/xmonad-docs/X11/Graphics-X11-Xlib-Types.html
Который среди прочего говорит:
Graphics.X11.Xlib.Types
A collection of type declarations for interfacing with Xlib.
Synopsis
Documentation
newtype Display
Source
pointer to an X11 Display structure
Constructors
Display (Ptr Display)
Instances
Eq Display
Data Display
Ord Display
Show Display
Typeable Display
Настоятельно рекомендуем задать этот вопрос на форуме C++