今天我听说了 D 编程并且它与 C 代码兼容。尽管如此,我还没有找到任何关于是否可以使用 D 中的 GTK 或 PortAudio 等 C 库的信息?如果可能的话,你能解释一下如何做到这一点吗?
5 回答
可以从 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)
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
您需要编写 C 绑定。 这个答案解释了如何。
看看http://dsource.org 有很多项目可以帮助你开始