在C / C ++中,如何链接在MS VStudio中用GCC / G ++编译的动态链接库?

时间:2010-06-07 16:52:20

标签: gcc

这些天,我使用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链接,但反之则无法正常工作。

无论如何,请原谅我可怜的英语,谢谢你的关心。

1 个答案:

答案 0 :(得分:1)

VS2005无法识别任何DLL来编译任何东西,我怀疑mingw会这样做。

当您的应用程序使用DL​​L时,您需要告诉VS2005 DLL提供了哪些功能。

加载时间绑定

入口点在DLL的EXPORT目录中定义。在编译DLL时,可以使用DEF文件定义EXPORT目录的内容。这些导出也可以使用#pragma __declspec(dllexport)指令定义。编译DLL时,链接器还将为使用应用程序生成* .LIB文件。此LIB称为导入库。

导出函数的签名必须由函数原型提供,通常在* .h文件中。

使用加载时绑定编译应用程序时,在源代码中包含* .h文件,并将导入库添加到项目设置中。 (而不是* .DLL)当O / S加载您的应用程序时,导入库中的静态代码将加载DLL,读取EXPORT目录并修复所有存根以访问导出的函数(和其他符号)。

动态绑定

您可以省略导入库,并在适当的时候使用LoadLibrayy使用您的代码加载DLL。您需要自己定义指向DLL入口点的指针,并且必须在调用GetProcAddress实际函数之前初始化这些指针。