这些天,我使用Flex& Bison生成了一些代码来开发一个类似SQL解析器的工具,这些代码无法在VS2005中静默编译(可能是另一个主题),但GCC / G ++运行良好,然后我在dll中使用mingw编译这些代码(在windows xp中) ),然后在VS2005中链接这些功能外观,但似乎在链接期间无法链接dll。
MS VS2005是否识别在Windows上使用mingw编译的dll?有什么需要做的吗?例如,在声明导出的API的include文件中添加一些内容?
有人可以给出一些建议吗?
条件是,如在VS2005中,如果要导出某些API,可以显示* .def文件以告诉nmake要导出哪个API,然后您可以创建(或某些)* .h文件声明这些API(添加一些 stdcall 相似的前缀作为调用protocal)和一些数据类型定义。但是使用GCC / G ++,你不需要做这些无聊的事情,只需使用[ar],就可以获得这些API,所以我的* .h文件不添加调用协议而且没有* .def,就像常见的函数声明一样。生成* .dll后,在VS2005项目目录中添加* .h文件和[mv]生成的* .dll,然后在项目设置中设置链接* .dll。这些步骤是否产生了我的问题?
BTW,我发现并测试了VC6编译的dll可以在Windows XP中与mingw链接,但反之则无法正常工作。无论如何,请原谅我可怜的英语,谢谢你的关心。
答案 0 :(得分:1)
VS2005无法识别任何DLL来编译任何东西,我怀疑mingw会这样做。
当您的应用程序使用DLL时,您需要告诉VS2005 DLL提供了哪些功能。
入口点在DLL的EXPORT目录中定义。在编译DLL时,可以使用DEF文件定义EXPORT目录的内容。这些导出也可以使用#pragma __declspec(dllexport)
指令定义。编译DLL时,链接器还将为使用应用程序生成* .LIB文件。此LIB称为导入库。
导出函数的签名必须由函数原型提供,通常在* .h文件中。
使用加载时绑定编译应用程序时,在源代码中包含* .h文件,并将导入库添加到项目设置中。 (而不是* .DLL)当O / S加载您的应用程序时,导入库中的静态代码将加载DLL,读取EXPORT目录并修复所有存根以访问导出的函数(和其他符号)。
您可以省略导入库,并在适当的时候使用LoadLibrayy使用您的代码加载DLL。您需要自己定义指向DLL入口点的指针,并且必须在调用GetProcAddress实际函数之前初始化这些指针。