【问题标题】:Calling function from dll with QT使用 QT 从 dll 调用函数
【发布时间】:2015-12-17 16:29:15
【问题描述】:

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

这是我的文件:

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 时,我正在访问 NULL 或其他人的内存或所以(我在调试时看不到值)。

我错过了什么?

【问题讨论】:

    标签: c++ qt dll segmentation-fault


    【解决方案1】:

    首先,要链接 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

    【讨论】:

      【解决方案2】:

      我也有同样的问题。我看到的几乎每个示例都有一个class 作为他们的示例,但我想导出像getNumber() 这样的函数。您现在可能知道它在 qt5 文档中。

      这一行需要在你的头文件中:

      extern "C" MYDLLSHARED_EXPORT int getNumber();
      

      它可以是mydll_global.hmydll.h,具体取决于您使用的是什么。

      mydll_global.h 将是 qtcreator 创建并放入导出定义的内容,如果您创建一个新的Shared Library 项目。

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

      尝试使用static MYDLLSHARED_EXPORT int getNumber();public static 函数添加到class 定义或仅使用命名空间(使用或不使用静态定义的函数)将在osx 上使用clang 给出not found for architecture x86_64 错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        相关资源
        最近更新 更多