【问题标题】:Creating shared c library with QT使用 QT 创建共享 c 库
【发布时间】:2020-03-14 08:03:18
【问题描述】:

我正在尝试使用 QT 创建一个共享(动态)c++ 库,但是在将使用此库的客户端应用程序中,不会有任何 qt 库链接。

我已经按照关于 qt 的教程创建了一个 pro 文件和头文件,如下例所示。

专业档案:

QT -= gui

TEMPLATE = lib
CONFIG += dynamiclib

CONFIG += c++11

# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS, MAITSCHSDK_LIBRARY

# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    maitchsdk.cpp

HEADERS += \
    maitchsdk.h

# Default rules for deployment.
unix {
    target.path = $$[QT_INSTALL_PLUGINS]/generic
}
!isEmpty(target.path): INSTALLS += target

头文件:

#ifndef MAITCHSDK_H
#define MAITCHSDK_H

#include <QtCore/QtGlobal>

#if defined(MAITSCHSDK_LIBRARY)
#  define MAITSCHSDK_EXPORT Q_DECL_EXPORT
#else
#  define MAITSCHSDK_EXPORT Q_DECL_IMPORT
#endif

class MAITSCHSDK_EXPORT  MAItchSDK
{
public:
    MAITSCHSDK_EXPORT MAItchSDK(const char *glimpseIp,int glimpsePort,const char *itchIp,int itchPort);
};

#endif // MAITCHSDK_H

但是当我这样实现它时,头文件包含 qt 依赖项,因此客户端应用程序也需要具有此依赖项,这不是我们想要的。 我的另一个要求是,这个库也可以用 golang 调用(通过使用 cgo)所以我需要用一些 extern "C" 方法为这个库项目创建一个 c 包装器,我浏览了所有文档和教程,但无法找到合适的解决方案。

有人知道如何使用 QT 创建基本的 C 共享库吗?

谢谢

【问题讨论】:

    标签: c++ qt go


    【解决方案1】:

    但是当我这样实现时,头文件包含 qt 依赖项,所以客户端应用程序也需要有这个依赖项,这不是我们想要的。

    要消除对 Qt 的依赖,您必须确保您的标头没有 #include 任何 Qt 标头。

    在您的情况下,您有 #include &lt;QtCore/QtGlobal&gt; 用于跨平台宏 Q_DECL_IMPORT/Q_DECL_EXPORT。从您的标题中删除这些并用您的平台特定版本替换跨平台宏(例如Q_DECL_IMPORT -> __declspec(dllimport) for Windows)

    不知何故,我需要使用一些 extern "C" 方法为这个库项目创建一个 c 包装器,我查看了所有文档和教程,但无法找到合适的解决方案。 p>

    这是与上述问题完全不同的问题。

    Qt 本身并不关心您是否在代码中使用extern "C"。因此,首先要专注于构建没有 Qt 依赖项的“普通 C++”DLL。

    成功后,您无需再更改 *.pro 文件。只需使用 extern "C" { ... } 将所有导出的函数包装在标题中即可。一个简单的例子见https://docs.microsoft.com/en-us/cpp/build/exporting-c-functions-for-use-in-c-or-cpp-language-executables?view=vs-2019

    另外,请参阅 StackOverflow 回答,了解使用 extern "C" 时必须遵循的限制:extern "C" with class and DLL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      相关资源
      最近更新 更多