【发布时间】:2010-12-10 11:27:33
【问题描述】:
今天我听说了 D 编程并且它与 C 代码兼容。尽管如此,我还没有找到任何关于是否可以使用 D 中的 GTK 或 PortAudio 等 C 库的信息? 如果可能,您能解释一下如何做到这一点吗?
【问题讨论】:
今天我听说了 D 编程并且它与 C 代码兼容。尽管如此,我还没有找到任何关于是否可以使用 D 中的 GTK 或 PortAudio 等 C 库的信息? 如果可能,您能解释一下如何做到这一点吗?
【问题讨论】:
可以从 D 调用 C 库。您需要做的是将 C 头文件转换为 D。在大多数情况下,这非常简单,并且有一个难以使用的 command-line tool帮助自动化流程。除了玩具示例之外,它从来没有真正对我有用,但它可能是一个很好的开始,可以看到需要完成的转换。只需放置一个 sn-p,您就无法自行将其转换为标题,然后查看 htod 对它的作用。
您通常会遇到的最大问题是创造性地使用 C 预处理器。有些东西可以转化为 D 中的 version() 语句,但不是全部。
至于实际编译和链接代码,在类unix平台上,我认为您可以使用GCC编译和链接C代码。在 Windows 上,您必须使用 DMC 编译 C 文件并与 DMD 链接。或者,您可以使用任何能够做到这一点的编译器将 C 代码编译成 DLL,然后要与 DMD 链接,您需要从 DLL 中创建一个与 DMD 兼容的导入库。这可以使用 DigitalMars 提供的免费 Basic Utilities Package 中的 implib 工具来完成。
还有很多这样的标题翻译已经完成。首先浏览 Dsource 的Bindings 项目很有用,或者在开始翻译 GTK 标头之类的大事之前先询问 digitalmars D 新闻组。很多流行的库,如 GTK 已经被打包(例如这里:GTKD)
【讨论】:
D 代码可以与 C 目标文件链接,并且可以与 C dll 交互,但您需要从要使用的 C 头文件生成一个 D 模块。 D 官方网站有a guide 做这件事。
【讨论】:
流行的替代方法是在运行时加载库。下面是一个如何加载 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 绑定。 This answer 解释一下。
【讨论】:
看看http://dsource.org 有很多项目可以帮助您入门
【讨论】: