При использовании 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++

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