gpt4 book ai didi

c++ - 使用 QT 创建共享 c 库

转载 作者:行者123 更新时间:2023-12-01 22:24:51 24 4
gpt4 key购买 nike

我正在尝试使用 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)所以我需要用一些 为这个库项目创建一个 c 包装器。外部“C”方法,我浏览了所有文档和教程,但无法找到合适的解决方案。

有谁知道如何使用 QT 创建一个基本的 C 共享库?

谢谢

最佳答案

But when I implement it like this, the header file contains qt dependencies so the client application also needs to have this dependencies which is not what we wanted.



要删除对 Qt 的依赖,您必须确保您的 header 不 #include任何 Qt 头文件。

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

somehow I need to create a c wrapper for this library project with some extern "C" methods, I've looked through all the documents and tutorials but couldnt able to find a proper solution.



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

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举个简单的例子。

此外,有关使用 extern "C" 时必须遵守的限制,请参阅此 StackOverflow 答案。 : extern "C" with class and DLL

关于c++ - 使用 QT 创建共享 c 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60680860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com