【问题标题】:Using external library in D在 D 中使用外部库
【发布时间】:2011-02-20 02:14:25
【问题描述】:

我在 Linux 上有一个 DMD + Tango 捆绑包。请给我一步一步的信息,我如何在 D 中使用外部库,例如zlib。我已经编译了zlib。

我有一个这样的文件树:

myzlib
├── include
│   ├── zconf.h
│   └── zlib.h
└── lib
    └── libz.a

我的myfile.d 源中有import tango.io.compress.ZlibStream; 调用。

这些是我的问题:

  1. 是否需要将这些文件复制到dmd/lib 目录?
  2. 需要修改dmd/bin/dmd.conf文件吗?
  3. 我应该如何调用 dmd 编译器 (dmd myfile.d -Llibz.a) 或其他名称(也许,使用绝对路径)?

我从未尝试使用任何其他语言的外部库。请帮帮我。

【问题讨论】:

    标签: external d zlib tango


    【解决方案1】:

    -L 标志告诉链接器将特定目录添加到其搜索路径。

    -l 告诉它链接到一个特定的库,并在其搜索路径上搜索以找到该库。

    使用 DMD,您必须使用 -L 标志将标志传递给链接器。 它可以采用绝对路径或相对路径,但路径需要相对于编译器的运行位置。因此,如果您使用相对路径,那么您总是必须从同一目录运行编译器 (这通常不是问题,因为您通常会在 Makefile 中使用构建命令,而您总是从中运行同一目录)

    最常见的是对系统上安装的库使用绝对路径,对特定于您的项目的库使用相对路径。

    因此,如果您有库 myzlib/lib/libz.a,则可以将 -L-Lmyzlib/lib -L-lz 传递给 dmd

    然后它将myzlib/lib添加到链接器的搜索路径中,然后在其搜索路径中查找libz.a(链接器知道在-l之后的部分,将lib添加到它的前面并在末尾添加.a 后缀以获取您要查找的库)

    可以将链接器标志添加到dmd.conf,但我真的不建议这样做。 dmd.conf 中的标志是 dmd always 用于 every 程序的标志。所以,你真的应该只有那些在你的程序中使用的标志。

    而是直接将它们提供给 dmd(无论是在命令行上还是作为 Makefile 的一部分)。

    至于头文件,您将需要在.d 文件中复制您需要的任何声明。

    头文件由 C 或 C++ 编译器使用,而不是链接器。 D 共享与 C 或 C++ 相同的链接器,但它的编译器是 dmd,而不是 gcc

    因此,您需要在 D 文件中复制 C 声明。最简单的方法是使用htod utility,但它只适用于 Windows 或 Wine。

    无论如何,您都需要在 .d 文件中声明要使用的 C 声明,并用 extern(C) 标记它们。

    【讨论】:

      【解决方案2】:

      如果您将构建设置为分别执行编译和链接步骤(就像使用 c 做的一样),它本质上与使用 C 做同样的事情相同。首先,让您的构建在没有额外的 lib (以确保您将所有需要的标志传递给链接器),然后正常添加库。要使用 D 中的 C 库需要绑定文件,它们实际上只是一个仅包含原型的 D 文件。

      【讨论】:

        猜你喜欢
        • 2015-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-30
        • 2011-04-20
        • 2017-09-29
        相关资源
        最近更新 更多