【问题标题】:Create C function binding from a header file in Crystal从 Crystal 中的头文件创建 C 函数绑定
【发布时间】:2020-06-25 03:20:14
【问题描述】:

我正在尝试在 Windows 中使用 gai_strerrorA 函数进行 C 绑定。 gai_strerrorA 定义存在于头文件(Ws2tcpip.h)上,而不存在于静态库文件(.lib 文件)上,Ws2_32.lib

gai_strerrorA function definition

WS2TCPIP_INLINE
char *
gai_strerrorA(
    _In_ int ecode)
{
    static char buff[GAI_STRERROR_BUFFER_SIZE + 1];

    (void)FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM
                             |FORMAT_MESSAGE_IGNORE_INSERTS
                             |FORMAT_MESSAGE_MAX_WIDTH_MASK,
                              NULL,
                              ecode,
                              MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                              (LPSTR)buff,
                              GAI_STRERROR_BUFFER_SIZE,
                              NULL);

    return buff;
}

我当前的解决方案是通过调用 FormatMessageA 在 Crystal 中重新创建函数定义,该函数定义在另一个 .lib 文件 (Kernel32.lib) 中定义。但是,有没有更好的方法来解决这个问题,也许通过链接水晶头文件?

【问题讨论】:

    标签: crystal-lang


    【解决方案1】:

    是的,重新实现可能是要走的路。这里更常见的主题是头文件中定义的 C 预处理器宏。不幸的是,我们几乎总是不得不重新实现和维护这些。

    我看到的唯一替代方法,有时也实际在社区中使用,是为这些函数或宏提供一个带有包装函数的小 C 文件,仅使用 cc -c 编译它并链接到生成的目标文件.这基本上也是目前绑定 C++ API 的唯一方法。

    您可以在编译器源代码本身中找到示例:对于 C API 中不可用的 SIGSEGV handling (binding) 和一些 LLVM functions (binding)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-09
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多