我在围绕如何与C/C++库接口时遇到了麻烦,包括静态(.lib/.a)和动态(.dll/.so),在D中.根据我的理解,可以告诉它DMD编译器与.lib文件链接,并且您可以使用Digital Mars提供的implib工具将.dll文件转换为.lib.另外,我遇到过这个页面,这意味着能够通过将C头文件转换为D接口文件来调用.dll中的函数.这两种方法都是等价的吗?这些相同的方法是否适用于Unix库文件?另外,如何从这些库中引用函数,枚举等,以及如何告诉他们的D编译器与这些库链接(我特别使用VisualD)?如果有人能提供一些从D代码引用.lib,.dll,.a和.so文件的例子,我将非常感激.
请注意,您正在处理生成可执行文件的三个阶段.在编译期间,您正在创建目标文件(.lib/.a只是目标文件的存档).创建这些文件后,您可以使用链接器将所有部分放在一起.处理动态库(.dll,.so)时,在程序启动时/运行时加载库有额外的步骤.
在编译期间,编译器只需要知道你正在使用什么,它不关心它是否被实现.这是D接口文件的用武之地,在这方面与Header Files相当.枚举在D接口文件中声明,并且还必须定义,因为它们仅在编译时存在.函数和变量只能声明没有正文.
int myFunction(char* str);
Run Code Online (Sandbox Code Playgroud)
将头文件转换为D的指南位于您引用的页面中.然后可以将这些文件传递给编译器或存在于Include Path中.
当链接器运行时,您将需要.lib/.a文件.这些文件可以传递给编译器,编译器将它们转发给链接器,或者你可以使用pragma(lib,"my.lib"); 在你的程序中.在这两种情况下,链接器必须能够在链接时(编译)找到.
在Linux中,我不认为链接动态和静态有什么区别.在Windows中,您甚至不需要D接口文件.相反,您必须通过系统调用获取该功能.我真的不熟悉这个领域,但我建议即时加载插件(DLL)
更新:我不禁大为与VisualD,但d为.NET程序员.
| 归档时间: |
|
| 查看次数: |
2558 次 |
| 最近记录: |