我第一次创建了一个用于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}}或其他人的记忆左右(我无法看到调试的价值)。
我错过了什么?
答案 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.h
或mydll.h
。
mydll_global.h
项目,则 Shared Library
将是qtcreator创建并放入导出定义的内容。
extern "C"
使我措手不及,因为我没有使用C,也不熟悉编译器如何导出符号。
尝试使用public
或仅使用名称空间(带有或不带有静态定义的函数)将static
class
函数添加到static MYDLLSHARED_EXPORT int getNumber();
定义中,将得到{{ 1}}在osx上使用clang错误。