从DLL创建符号库以与MINGW32一起使用

时间:2010-12-16 19:03:19

标签: c++ netbeans g++ mingw32

我正在使用C ++,Qt,Mingw32和Netbeans开发应用程序。我需要使用由公司软件组开发的内部API。 我有需要链接的DLL的符号库.lib文件,但是我不能将这些库与Mingw32一起使用,它可以与Microsoft Visual Studio一起使用。

有没有人知道是否有办法导出符号并创建一个与Mingw32一起使用的.a符号库?如果没有,我想我必须转到Visual Studio。

我尝试使用“pexports”程序创建.def文件和dlltool,但这不起作用。仍然有未引用的符号错误,然后我将它所抱怨的符号添加到.def中,因为它们不在那里而且它停止了抱怨和编译。但程序崩溃了。我在Visual Studio中尝试了相同的代码,它编译并运行良好。

5 个答案:

答案 0 :(得分:0)

您是否考虑过动态加载DLL? LoadLibrary,GetProcAddress等。您可以轻松编写一个封装所有DLL入口点的类,加载和卸载库,并执行所有#typedefs等。这是一项繁重的工作,但如果它是一个内部库,那么可能还没有进入点太多了?

导入库被高估了。 :P

答案 1 :(得分:0)

不确定是否有帮助,但您可能希望查看this guide

答案 2 :(得分:0)

以下是我为mysql库做的。

使用dllwrap创建导出列表:

dllwrap --export-all-symbols --output-def libmysql.def libmysql.dll --implib liblibmysql.a

这会在.def文件中创建一个导出列表,但名称错误不正确。 在文本编辑器中编辑.def文件并删除“@”符号。 符号名称通常也附加一个数字。 除了通过实验,我不知道如何确定正确的名称:

运行以下命令以创建netbeans兼容库:

dlltool --input-def libmySQL.def --dllname libmySQL.dll --output-lib libMySQLclient.a -k

用它编译,你会得到未定义的符号。未定义的符号将具有正确的装饰。 再次编辑.def文件并更正符号名称。重新运行dlltool以获取正确的.a库文件。

答案 3 :(得分:0)

您是否尝试过直接链接DLL,而不是.a / .lib? MinGW通常很乐意为您做到这一点。

答案 4 :(得分:0)

我放弃了,有些人说用c ++导出的微软编译器编译的dll是不可能的,因为名称错误