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

时间:2014-10-23 10:07:03

标签: c++ qt visual-c++ dll borland-c++

我有一个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中做到这一点。任何解释和帮助将非常感激。谢谢

P.S。我查看了帖子Using VS dll in old BorlandImport VS dll in C Builder,但他们 没有帮助我理解这个问题。

1 个答案:

答案 0 :(得分:1)

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

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

EXPORTS foo

然后转到您的图书馆项目设置 - &gt;链接器 - &gt;输入 - &gt;模块定义文件

并填写您的.def文件名