【问题标题】:How to use a C library from D?如何使用 D 中的 C 库?
【发布时间】:2010-12-10 11:27:33
【问题描述】:

今天我听说了 D 编程并且它与 C 代码兼容。尽管如此,我还没有找到任何关于是否可以使用 D 中的 GTK 或 PortAudio 等 C 库的信息? 如果可能,您能解释一下如何做到这一点吗?

【问题讨论】:

    标签: c d


    【解决方案1】:

    可以从 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

    【讨论】:

      【解决方案2】:

      D 代码可以与 C 目标文件链接,并且可以与 C dll 交互,但您需要从要使用的 C 头文件生成一个 D 模块。 D 官方网站有a guide 做这件事。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          您需要编写 C 绑定。 This answer 解释一下。

          【讨论】:

            【解决方案5】:

            看看http://dsource.org 有很多项目可以帮助您入门

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-11-23
              • 1970-01-01
              • 1970-01-01
              • 2011-05-17
              相关资源
              最近更新 更多