在D中使用外部库

时间:2011-02-20 02:14:25

标签: external d zlib tango

我在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 个答案:

答案 0 :(得分:8)

-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(无论是在命令行上还是作为Makefile的一部分)。

对于头文件,您需要复制.d文件中所需的任何声明。

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

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

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

答案 1 :(得分:1)

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