在D中使用外部库

Sig*_*oli 7 d external zlib tango

我在linux上有一个DMD + Tango软件包.请告诉我一步一步的信息,例如,如何在D中使用外部库zlib.我编译了zlib.

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

myzlib
??? include
?   ??? zconf.h
?   ??? zlib.h
??? lib
    ??? libz.a
Run Code Online (Sandbox Code Playgroud)

我接到了import tango.io.compress.ZlibStream;电话myfile.d.

这些是我的问题:

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

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

Jon*_*vis 8

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

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

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

最常见的是使用系统上安装的库的绝对路径以及特定于项目的库的相对路径.

所以,如果你有图书馆myzlib/lib/libz.a,你会-L-Lmyzlib/lib -L-lz转到dmd.

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

可以添加链接器标志dmd.conf,但我真的不建议.标志dmd.conf是dmd 总是用于每个程序.所以,你应该只在那里使用所有程序中使用的标志.

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

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

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

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

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