我有一个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 Borland和Import VS dll in C Builder,但他们 没有帮助我理解这个问题。
答案 0 :(得分:1)
如果要导出 foo 函数,则需要以某种方式告诉链接器。 你的建议是使用.def文件,这很容易。
只需在项目目录中创建一个类似 exports.def 的文件,然后输入如下内容:
EXPORTS
foo
然后转到您的图书馆项目设置 - &gt;链接器 - &gt;输入 - &gt;模块定义文件
并填写您的.def文件名