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

标签 c++ c d

我无法思考如何在 D 中与 C/C++ 库(包括静态 (.lib/.a) 和动态 (.dll/.so))交互。据我了解,这是可能的告诉 DMD 编译器与 .lib 文件链接,并且您可以使用 Digital Mars 提供的 implib 工具将 .dll 文件转换为 .lib。另外,我遇​​到了this page ,这意味着能够通过将 C 头文件转换为 D 接口(interface)文件来调用 .dll 中的函数。这两种方法是否等效?这些相同的方法是否适用于 Unix 库文件?此外,如何从这些库中引用函数、枚举等,以及如何告诉他们的 D 编译器与这些库链接(我正在使用 VisualD,特别是)?如果有人可以提供一些从 D 代码引用 .lib、.dll、.a 和 .so 文件的示例,我将不胜感激。

最佳答案

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

在编译过程中,编译器只需要知道你在使用什么,它并不关心它是否被实现。这就是 D 接口(interface)文件的用武之地,在这方面相当于头文件。枚举在 D 接口(interface)文件中声明,也必须定义,因为它们仅在编译时存在。函数和变量可以在没有主体的情况下声明。

int myFunction(char* str);

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

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

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

更新:我对 VisualD 帮不上什么忙,但是有 D for .NET Programmers .

关于c++ - 在 D 中调用动态库和静态库中的 C/C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6191772/

相关文章:

c++ - 直接从 C++ 调用 D 函数

c++ - 在 C++ 模板中使用尖括号会带来哪些语法问题?

c++ - 一旦另一个事件发生,我的 libevent 计时器就会停止……这正常吗?

将 int 指针转换为 char 指针

c - 如果字符串的长度未知,如何从字符串中提取子字符串

c++ - 如何在 Mac OS 上获取视频捕获设备(网络摄像头)列表? (C++)

templates - 检查符号是否是 D 中的成员函数/字段的[指针]

c++ - 如何创建圆形碰撞检测? C++

c++ - 关闭一个 ApplicationWindow 并打开一个新的?

c++ - C++.Net 程序集可以轻松反编译吗?