gpt4 book ai didi

c - 使用 hsc2hs 时,在 haskell 源代码中引入 #include 指令会导致大量错误

转载 作者:行者123 更新时间:2023-11-30 16:51:38 26 4
gpt4 key购买 nike

我正在编写一个 Haskell 程序,该程序应该了解有关 X11 状态的一些详细信息,因此我尝试定义一个 FFI 来调用相关的 X11 共享库符号。我通常遵循 wikibook 中的说明。当我添加引用官方 X11 header 的 include 指令时,hsc2hs 向我抛出一堆错误,就好像所述 header 在语法上不正确一样。我不得不编写自己的 header ,该 header 本质上是从上游 header 文件中复制我需要的位,并让我的代码进行编译。

具体来说,我需要在 X11/extensions/XKBrules.h 中声明的 _XkbRF_VarDefs。您可以在repository查看我的代码:commit 4d77785 包含我必须编写才能编译的 header ,而在 8d5e76c 中,您会发现我最新的尝试包含无法编译的官方 header (您可能会请参阅下面的错误日志)。

官方 header 是否已损坏?或者是hsc2hs?我是否需要在 make 脚本中的 hsc2hs 调用中添加一些魔法标志,以使其使用官方 header 进行编译?

错误日志:

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/

附注在评论中,有人指出 Ubuntu 安装中不存在 XKBrules.h。我使用 Arch Linux,该文件位于 extra/libxkbfile 包中,它是 gnome-desktopxorg-setxkbmap的依赖项em>xterm 等等。

最佳答案

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

关于c - 使用 hsc2hs 时,在 haskell 源代码中引入 #include 指令会导致大量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41701875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com