我在思考如何与D中的C/C++库( .lib /.a)和动态库( .dll /.so)进行交互时遇到了麻烦。据我所知,可以告诉DMD编译器链接.lib文件,并且可以使用Digital Mars提供的隐式工具将.dll文件转换为.lib。此外,我还遇到过this page,它意味着可以通过将C头文件转换为D接口文件来调用.dlls中的函数。这两种方法是等价的吗?这些相同的方法是否适用于Unix库文件?另外,如何从这些库中引用函数、枚举等,以及如何告诉他们的D编译器与这些库链接(我特别使用VisualD )?如果有人能提供一些从D代码引用.lib、.dll、.a和.so文件的示例,我将不胜感激。
发布于 2011-06-01 06:44:07
注您正在处理生成可执行文件的三个阶段。在编译过程中,您正在创建目标文件(.lib/.a只是目标文件的归档)。一旦创建了这些文件,您就可以使用链接器将所有部分放在一起。在处理动态库(.dll、.so)时,有一个额外的步骤,那就是在程序启动时/在运行时加载库。
在编译过程中,编译器只需要知道你使用的是什么,它并不关心它是否被实现。这就是D接口文件的用武之地,在这方面,D接口文件在某种程度上等同于头文件。枚举是在D接口文件中声明的,而且还必须定义,因为它们只在编译时存在。函数和变量只能在没有主体的情况下声明。
int myFunction(char* str);将头文件转换为D的指南位于您引用的页面中。然后,这些文件可以传递给编译器或存在于包含路径中。
链接器运行时是您需要.lib/.a文件的时候。这些文件可以传递给编译器,编译器会将它们转发给链接器,或者您可以在程序中使用杂注(lib,"my.lib");。在这两种情况下,链接器都必须能够在链接时找到(编译)。
在Linux中,我不认为链接动态和静态是有区别的。在Windows中,您甚至不需要D接口文件。相反,您必须通过系统调用来获取函数。我对这个领域真的不是很熟悉,但我建议使用Loading Plugins (DLLs) on-the-fly
更新:我对VisualD无能为力,但还是有D for .NET Programmers的。
发布于 2011-06-01 03:25:20
有D分布的样本如何做到这一点。
你需要像这样定义thunk模块:
module harmonia.native.win32;
version(build) { pragma(nolink); }
export int DialogBoxParamA(HINSTANCE hInstance, LPCSTR lpTemplateName,
HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam);并包括定义了DialogBoxParamA等函数的DLL的导入库。
https://stackoverflow.com/questions/6191772
复制相似问题