今天我听说过D编程,它与C代码兼容。不过我还没有找到任何关于是否可以使用D的GT库或PortAudio等C库的信息? 如果有可能,你能解释一下如何做到吗?

有帮助吗?

解决方案

可以从D调用C库。您需要做的是将C头文件转换为D.在大多数情况下,这是非常简单的,并且有一个难以使用的命令行工具,以帮助自动化该过程。除了玩具示例之外,它对我来说从来没有真正起作用,但它可能是一个很好的开始,可以看到需要进行的转换。只需添加一个代码片段,您就无法自行转换为标题,并了解htod的用途。

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

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

还有很多这些标题翻译已经完成。首先浏览Dsource的 Bindings 项目,或者在开始使用之前首先询问数字地图D新闻组是很有用的。很像翻译GTK标题。许多像GTK这样的流行图书馆已被包装好(例如: GTKD

其他提示

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

流行的替代方法是在运行时加载库。以下是如何加载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

查看 http://dsource.org 有许多项目可以帮助您开始

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top