如何从D语言中使用C库?

20

今天我了解到D编程语言,它与C代码兼容。但是我没有找到任何信息表明是否可以从D使用C库,比如GTK或PortAudio?如果可能的话,您能解释一下如何做到吗?

5个回答

19
可以从D调用C库。您需要做的是将C头文件转换为D。大部分情况下这很简单,并且有一个难以使用的命令行工具来帮助自动化这个过程。在我尝试过的除了玩具示例之外,它从未真正起作用过,但它可能是一个很好的开始,以查看需要完成的转换类型。只需将您遇到翻译困难的代码片段放入一个单独的头文件中,然后看看htod如何处理它。
通常遇到的最大问题是创造性地使用C预处理器。有些东西可以转换成D中的version()语句,但并非全部。
至于实际编译和链接代码,在类Unix平台上,我认为您可以使用GCC编译和链接C代码。在Windows上,您必须使用DMC编译C文件,并使用DMD链接。或者,您可以使用任何能够编译DLL的编译器将C代码编译为DLL,然后要链接DMD,您需要从DLL制作一个DMD兼容的导入库。这可以使用DigitalMars提供的免费Basic Utilities Package中的implib工具完成。

还有很多这些头文件的翻译已经完成了。在着手像翻译GTK头文件这样的大型任务之前,最好先浏览Dsource的Bindings项目或在digitalmars D新闻组上提问。许多流行的库,如GTK,已经被封装了(例如:GTKD)。


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


4

D 代码可以与 C 对象文件链接,并且可以与 C dlls 进行交互,但是您需要从要使用的 C 头文件生成 D 模块。官方 D 网站提供了一份 指南 来完成这个任务。


1

你需要编写C语言绑定。 这个答案解释了如何做。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接