19

今天我听说了 D 编程并且它与 C 代码兼容。尽管如此,我还没有找到任何关于是否可以使用 D 中的 GTK 或 PortAudio 等 C 库的信息?如果可能的话,你能解释一下如何做到这一点吗?

4

5 回答 5

19

可以从 D 调用 C 库。您需要做的是将 C 头文件转换为 D。在大多数情况下,这非常简单,并且有一个难以使用的命令行工具来帮助自动化过程。除了玩具示例之外,它从来没有真正对我有用,但它可能是一个很好的开始,可以看到需要完成的转换。只需将您在翻译成标题时遇到问题的代码段放入标题中,然后查看 htod 对它的作用。

您通常会遇到的最大问题是创造性地使用 C 预处理器。有些东西可以变成 D 中的 version() 语句,但不是全部。

至于实际编译和链接代码,在类 unix 平台上,我认为您可以使用 GCC 编译和链接 C 代码。在 Windows 上,您必须使用 DMC 编译 C 文件并与 DMD 链接。或者您可以使用任何能够做到这一点的编译器将 C 代码编译成 DLL,然后要与 DMD 链接,您需要从 DLL 中创建一个与 DMD 兼容的导入库。这可以使用 DigitalMars 提供的免费基本实用程序包中的 implib 工具来完成。

还有很多这些标题翻译已经完成。首先浏览Dsource的Bindings项目很有用,或者先在 digitalmars D 新闻组上询问,然后再着手翻译 GTK 标头之类的大事。许多流行的库,如 GTK 已经被打包(例如这里:GTKD

于 2009-10-27T13:50:57.800 回答
4

D 代码可以与 C 目标文件链接,并且可以与 C dll 交互,但您需要从要使用的 C 头文件生成一个 D 模块。官方 D 网站有一个指南来做这件事。

于 2009-10-27T13:06:28.013 回答
4

流行的替代方法是在运行时加载库。这是一个如何加载 libpng 并调用 libpng 函数的示例:

module libpngtest;

import std.stdio;
import core.sys.posix.dlfcn;

alias uint function() png_access_version_number_t;

int main() {
  auto lib = dlopen("libpng.so".ptr, RTLD_LAZY | RTLD_LOCAL);
  if (lib is null) {
    writeln("EEEK!");
    writeln(to!string(dlerror()));
    return -1;
  } else {
    writeln("WOOT!");
    auto png_access_version_number = cast(png_access_version_number_t)dlsym(lib, "png_access_version_number");
    writeln(png_access_version_number());
  }

  if (dlclose(lib) == 0) {
    return 0;
  } else {
    return -1;
  }
} // main() function

// compile: dmd libpngtest.d -L-ldl
// run:     ./libpngtest

使用 DPaste 对其进行测试:http ://www.dpaste.dzfl.pl/917bc3fb

于 2012-11-02T22:41:25.987 回答
1

您需要编写 C 绑定。 这个答案解释了如何。

于 2012-04-08T14:41:13.340 回答
0

看看http://dsource.org 有很多项目可以帮助你开始

于 2009-11-27T08:18:32.267 回答