7

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

我有一个像这样的文件树:

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

我的消息来源import tango.io.compress.ZlibStream;中有电话myfile.d

这些是我的问题:

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

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

4

2 回答 2

8

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

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

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

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

所以,如果你有图书馆myzlib/lib/libz.a,你会传递-L-Lmyzlib/lib -L-lzdmd.

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

可以将链接器标志添加到dmd.conf,但我真的不建议这样做。中的标志dmd.conf是 dmd始终用于每个程序的标志。因此,您实际上应该只拥有所有程序中使用的标志。

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

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

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

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

无论如何,您需要声明您将在.d文件中使用的 C 声明并用extern(C).

于 2011-02-20T11:23:29.357 回答
1

If you set up your build to do the compile and link steps separately (like it is common to do with c), it is essentially identical to doing the same with C. First, get your build working without the extra lib (to make sure you are passing all the needed flags to the linker) and then add the libs in as normal. To use a C library from D requires a bindings file, they are effectively just a D file consisting only of prototypes.

于 2011-02-20T17:34:00.337 回答