如何使用D的C库?

今天我听说过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提供的免费Basic Utilities包中的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

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

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