用 VS 编译器在 Qt 中编译 dll 以在 Borland 中使用

Posted

技术标签:

【中文标题】用 VS 编译器在 Qt 中编译 dll 以在 Borland 中使用【英文标题】:Compile dll in Qt with VS compiler to use it in Borland 【发布时间】:2014-10-23 10:07:02 【问题描述】:

我有一个 C 函数包,我需要从中创建 DLL 库,可以在 C++ 程序中使用。我以前没有做过任何图书馆,所以我完全是初学者。我在 Qt Creator 中工作。

我的第一次尝试是根据手册Creating shared libraries创建它,所以我将这两行添加到我的项目文件中:

TEMPLATE = lib
DEFINES += MYLIB_LIBRARY

然后我创建了 mylib.h 文件

#ifndef MYLIB_H
#define MYLIB_H

#include "mylib_global.h"
#include "functions1.h"
#include "functions2.h"
#include "functions3.h"

class MYLIBSHARED_EXPORT Mylib


public:
    Mylib();
;

#endif // MYLIB_H

最后我添加了 mylib_global.h:

#ifndef MYLIB_GLOBAL_H
#define MYLIB_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(MYLIB_LIBRARY)
#  define MYLIBSHARED_EXPORT Q_DECL_EXPORT
#else
#  define MYLIBSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // MYLIB_GLOBAL_H

为了使函数在 C++ 中可用,我对库中的每个函数都使用了这些行

#ifdef __cplusplus
extern "C"
#endif

void foo();

#ifdef __cplusplus

#endif

使用 MSVC2012 编译时一切正常,我得到了一些 .dll 文件。但后来我将库发送给了希望在 Borland C++ 中使用它的人。他告诉我,我必须用一些 DEF 文件编译它来告诉 VS 编译器正确的名称,并且__stdcall 而不是__cdecl。但我不知道如何在 Qt 中做到这一点。任何解释和帮助将不胜感激。谢谢

附:我查看了Using VS dll in old Borland 和Import VS dll in C Builder 的帖子,但他们 没有帮助我理解问题。

【问题讨论】:

即使您通过了命名,您也可能会遇到 CRT 冲突(多个独立堆和不兼容的标准库)。我会告诉朋友是时候使用现代编译器了。 【参考方案1】:

如果你想导出 foo 函数,你需要以某种方式告诉链接器。 建议您使用 .def 文件,这很容易。

只需在您的项目目录中创建一个类似 exports.def 的文件,然后在其中写入如下内容:

EXPORTS foo

然后转到你的库项目设置 -> 链接器 -> 输入 -> 模块定义文件

并填写您的 .def 文件名

【讨论】:

谢谢,我试试这个,看起来很简单。但我仍然不确定如何将 __cdecl 更改为 __stdcall 问题。我应该删除 mylib.h 和 mylib_global.h 文件,然后将 __stdcall 写入每个函数吗?还是因为 DEF 文件就足够了,我不需要写任何特定于我的函数声明的东西? 我不确定。您最安全的选择显然是将 __stdcall 放在每个函数之前。也许有一个全局编译器设置。

以上是关于用 VS 编译器在 Qt 中编译 dll 以在 Borland 中使用的主要内容,如果未能解决你的问题,请参考以下文章

Qt Creator调用VS2008生成的DLL注意事项 good

如何使用 msvc 2019 编译 QT 4 dll?

QT用VS还是MINGW编译好,有啥区别

VS2012编译的DLL动态库为啥在VS2012上调用正常,在VS2008上使用失败

我在VS2017里面用C#在.net framework上编写了一个dll,我想编译,怎么解决?

Qt 如何生成可执行程序,用mingw32-make生成的缺少dll文件