我正在编写一个 Haskell 程序,它应该知道有关 X11 状态的一些细节,所以我尝试定义一个 FFI 来调用相关的 X11 共享库的符号。我通常按照 wikibook中的说明进行操作。当我添加一个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等的依赖项。