我在linux上有一个DMD + Tango软件包。请给我一步一步的信息,如何在D中使用外部库,例如zlib
。我编译了zlib。
我有一个这样的文件树:
myzlib
├── include
│ ├── zconf.h
│ └── zlib.h
└── lib
└── libz.a
我的import tango.io.compress.ZlibStream;
来源中有myfile.d
来电。
这些是我的问题:
dmd/lib
目录?dmd/bin/dmd.conf
文件?dmd
编译器(dmd myfile.d -Llibz.a
)或其他东西(可能是绝对路径)?我从未尝试过使用任何其他语言的外部库。请帮帮我。
答案 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文件。