使用QT从dll调用函数

时间:2015-09-21 04:23:26

标签: c++ qt dll segmentation-fault

我第一次创建了一个用于C ++的dll(然后是C#,我计划在C ++和C#应用程序之间共享这个dll)使用QT创建器但是当我尝试使用它时,我得到了SEGFAULT错误。< / p>

这是我的档案:

mydll.h

#ifndef MYDLL_H
#define MYDLL_H

#include "mydll_global.h"

class MYDLLSHARED_EXPORT MyDll
{

public:
    MyDll();
    int getAnswer();
};


MYDLLSHARED_EXPORT int getNumber();

#endif // MYDLL_H

mydll_global.h

#ifndef MYDLL_GLOBAL_H
#define MYDLL_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(MYDLL_LIBRARY)
#  define MYDLLSHARED_EXPORT Q_DECL_EXPORT
#else
#  define MYDLLSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // MYDLL_GLOBAL_H

mydll.cpp

#include "mydll.h"


MyDll::MyDll()
{
}

int MyDll::getAnswer()
{
    return 42;
}

int getNumber()
{
    return 10;
}

所以我构建它并创建mydll.dll:然后我去了其他C ++项目,我想使用这个dll并放入.pro文件:

LIBS += "C:\path\to\mydll.h"

并在main.cpp中

#include "mydll.h"

当我使用dll中的函数时:

 qDebug() << getNumber();

我收到SEGFAULT错误。

我认为提供编译器类型信息的标头和编译器提供函数体的dll是我所需要的,但是我得到SEGFAULT我正在进行{{} 1}}或其他人的记忆左右(我无法看到调试的价值)。

我错过了什么?

2 个答案:

答案 0 :(得分:2)

首先,要链接DLL,您需要该DLL的链接.lib文件。该文件包含所有用于链接的二进制清单。

其次,项目文件LIBS子句指定要链接的.lib文件列表。其中一些可能代表动态库(.dll)。

请参阅示例:Linking to Shared Library in Qt

更好的文章包括用Qt创建DLL和在Qt项目中使用DLL:https://wiki.qt.io/How_to_create_a_library_with_Qt_and_use_it_in_an_application

答案 1 :(得分:0)

我有同样的问题。我看过的几乎每个示例都以class为例,但是我想导出类似getNumber()的函数。您现在可能已经知道它在qt5文档中。

此行必须在您的头文件中:

extern "C" MYDLLSHARED_EXPORT int getNumber();

,根据您使用的是mydll_global.hmydll.h

如果创建新的mydll_global.h项目,则

Shared Library将是qtcreator创建并放入导出定义的内容。

extern "C"使我措手不及,因为我没有使用C,也不熟悉编译器如何导出符号。

尝试使用public或仅使用名称空间(带有或不带有静态定义的函数)将static class函数添加到static MYDLLSHARED_EXPORT int getNumber();定义中,将得到{{ 1}}在osx上使用clang错误。