首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在D中使用C库?

如何在D中使用C库?
EN

Stack Overflow用户
提问于 2009-10-27 20:52:55
回答 5查看 4.7K关注 0票数 19

今天我听说了D编程,它与C代码兼容。然而,我还没有找到任何关于是否可以在D中使用像GTK或PortAudio这样的C库的信息?如果可能的话,你能解释一下怎么做吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-10-27 21:50:58

从D调用C库是可能的,您需要做的是将C头文件转换为D。在大多数情况下,这非常简单,而且有一个难以使用的command-line tool来帮助自动化这个过程。除了玩具示例之外,它对我来说从来没有真正起过作用,但这可能是一个很好的开始,可以看到需要完成的那种转换。只需将您在将其自身转换为头文件时遇到问题的代码片段放入其中,看看htod对它做了什么。

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

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

也有很多这样的头转换已经完成了。首先浏览Dsource的Bindings项目,或者在着手翻译GTK头文件之前,先询问digitalmars D新闻组是很有用的。很多像GTK这样的流行类库已经被包装好了(例如这里:GTKD)

票数 19
EN

Stack Overflow用户

发布于 2009-10-27 21:06:28

D代码可以与C对象文件链接,也可以与dlls交互,但您需要从要使用的C头文件生成D模块。D官方网站提供了a guide来做这件事。

票数 4
EN

Stack Overflow用户

发布于 2012-11-03 06:41:26

流行的替代方法是在运行时加载库。下面是如何加载libpng并调用libpng函数的示例:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1630597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档