1

我正在编写一个 Haskell 程序,它应该知道有关 X11 状态的一些细节,所以我尝试定义一个 FFI 来调用相关的 X11 共享库的符号。我通常按​​照 wikibook中的说明进行操作。当我添加一个include引用官方 X11 标头的指令时,hsc2hs会向我抛出一大堆错误,就好像所述标头在语法上不正确一样。我不得不求助于编写自己的头文件,它基本上复制了上游头文件中我需要的位,并让我的代码编译。

具体来说,我需要_XkbRF_VarDefsX11/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-desktopxorg-setxkbmapxterm等的依赖项。

4

1 回答 1

0

对 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++ 论坛上提出这个问题

于 2017-01-17T17:29:22.123 回答