在D语言中使用外部库

7

我在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),还是其他方式(也许带有绝对路径)?
我从未尝试在其他语言中使用外部库。请帮帮我。
2个回答

8
-L标志告诉链接器将特定目录添加到其搜索路径中。 -l告诉链接器链接特定库,并在其搜索路径上查找该库。
使用DMD时,您必须使用-L标志向链接器传递标志。它可以采用绝对路径或相对路径,但路径需要相对于编译器运行的位置。因此,如果您使用相对路径,则必须始终从同一目录运行编译器(通常不是问题,因为您通常会在Makefile中具有构建命令,并且始终从同一目录运行)。
最常见的是对系统安装的库使用绝对路径,对项目特定库使用相对路径。
因此,如果您有库myzlib/lib/libz.a,则应向dmd传递-L-Lmyzlib/lib -L-lz
然后,它将在链接器的搜索路径中添加myzlib/lib,然后在其搜索路径中查找libz.a(链接器知道取以下部分,将其前面加上lib并在末尾添加.a后缀以获取您要查找的库)。
您可以将链接器标志添加到dmd.conf中,但我真的不建议这样做。 dmd.conf中的标志是dmd始终用于每个程序的标志。因此,您应该只在所有程序中使用的标志中拥有它们。
相反,直接将它们提供给dmd(无论是在命令行上还是作为Makefile的一部分)。
至于头文件,您需要在.d文件中复制所需的任何声明。
头文件由C或C++编译器使用,而不是链接器。 D与您用于C或C ++的相同链接器共享,但其编译器是dmd,而不是gcc
因此,您需要在D文件中复制C声明。最简单的方法是使用htod实用程序,但它仅适用于Windows或Wine。
无论如何,您都需要在.d文件中声明要使用的C声明,并将其标记为extern(C)

1

如果您设置构建以分别执行编译和链接步骤(就像使用C语言一样常见),那么它与使用C语言基本相同。首先,让您的构建在没有额外库的情况下工作(以确保将所有必需的标志传递给链接器),然后像平常一样添加库。要从D中使用C库,需要绑定文件,它们实际上只是由原型组成的D文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接