在D中调用动态和静态库中的C / C ++函数

时间:2011-05-31 18:20:17

标签: c++ c d

我无法解决如何在D中与C / C ++库(静态(.lib / .a)和动态(.dll / .so))进行交互的问题。根据我的理解,它是可能的告诉DMD编译器链接.lib文件,并且可以使用Digital Mars提供的implib工具将.dll文件转换为.lib。另外,我遇​​到this page,这意味着能够通过将C头文件转换为D接口文件来调用.dll中的函数。这两种方法都是等价的吗?这些相同的方法是否适用于Unix库文件?另外,如何从这些库中引用函数,枚举等,以及如何告诉他们的D编译器与这些库链接(我特别使用VisualD)?如果有人能提供一些从D代码引用.lib,.dll,.a和.so文件的例子,我将非常感激。

2 个答案:

答案 0 :(得分:5)

请注意,您正在处理生成可执行文件的三个阶段。在编译期间,您正在创建目标文件(.lib / .a只是目标文件的存档)。创建这些文件后,您可以使用链接器将所有部分放在一起。处理动态库(.dll,.so)时,在程序启动时/运行期间有额外的步骤加载库。

在编译期间,编译器只需要知道你正在使用什么,它不关心它是否被实现。这是D接口文件的用武之地,在这方面与Header Files相当。枚举在D接口文件中声明,并且还必须定义,因为它们仅在编译时存在。函数和变量只能声明没有正文。

int myFunction(char* str);

将头文件转换为D的指南位于您引用的页面中。然后可以将这些文件传递给编译器或存在于Include Path中。

当链接器运行时,您将需要.lib / .a文件。这些文件可以传递给编译器,编译器将它们转发给链接器,或者你可以使用pragma(lib,“my.lib”);在你的程序中。在这两种情况下,链接器必须能够在链接时找到(编译)。

在Linux中我不认为链接动态和静态有什么区别。在Windows中,您甚至不需要D接口文件。相反,您必须通过系统调用获取该功能。我对这个领域并不熟悉,但我建议Loading Plugins (DLLs) on-the-fly

更新:我对VisualD无能为力,但有D for .NET Programmers

答案 1 :(得分:1)

D分布中的样本如何做到这一点。

你需要像这样定义thunk模块:

module harmonia.native.win32;
version(build) { pragma(nolink); }

export int DialogBoxParamA(HINSTANCE hInstance, LPCSTR lpTemplateName,
  HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);

并包含DLL的导入库,其中定义了DialogBoxParamA等函数。