1

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

有谁知道是否有办法导出符号并创建一个与 Mingw32 一起使用的 .a 符号库?如果不是,我猜我将不得不转到 Visual Studio。

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

4

5 回答 5

0

不确定它是否有帮助,但您不妨查看本指南

于 2010-12-16T19:37:12.307 回答
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 库文件。

于 2010-12-16T19:40:20.587 回答
0

您是否考虑过动态加载 DLL?LoadLibrary、GetProcAddress 等。您可能可以轻松编写一个封装所有 DLL 入口点、加载和卸载库以及执行所有#typedef 等的类。这很麻烦,但如果它是一个内部库,则可能有没有太多的入口点?

导入库被高估了。:p

于 2010-12-16T19:09:25.787 回答
0

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

于 2010-12-16T20:16:14.987 回答
0

我放弃了,有人说在微软编译器上编译的 dll 是不可能的,因为它的名字是 mangling

于 2010-12-17T15:00:44.957 回答