Создание общей c библиотеки с QT - PullRequest
0 голосов
/ 14 марта 2020

Я пытаюсь создать разделяемую (динамическую c) библиотеку c ++ с QT, однако в клиентском приложении, которое собирается использовать эту библиотеку, не будет никаких связанных библиотек qt.

I ' Мы следовали инструкциям по qt и создали файл pro и заголовочный файл, как показано в следующем примере.

Pro File:

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 для этого библиотечного проекта с некоторым extern " C " методы, я просмотрел все документы и учебные пособия, но не смог найти правильного решения.

Кто-нибудь знает, как мне создать основу c C общая библиотека с использованием QT?

Спасибо

1 Ответ

0 голосов
/ 15 марта 2020

Но когда я реализую его таким образом, файл заголовка содержит зависимости qt, поэтому клиентское приложение также должно иметь эти зависимости, а не то, что мы хотели.

Чтобы удалить зависимость в Qt вы должны убедиться, что ваш заголовок не содержит #include каких-либо заголовков Qt.

В вашем случае у вас есть #include <QtCore/QtGlobal>, который используется для кроссплатформенных макросов Q_DECL_IMPORT / Q_DECL_EXPORT. Удалите их из заголовка и замените кроссплатформенные макросы на версию, указанную для вашей платформы c (например, Q_DECL_IMPORT -> __declspec(dllimport) для Windows)

каким-то образом мне нужно создать Оболочка c для этого библиотечного проекта с некоторыми extern "C" методами. Я просмотрел все документы и руководства, но не смог найти правильного решения.

Эта проблема полностью отделена от описанной выше.

Самому Qt все равно, используете ли вы в коде extern "C" или нет. Итак, сначала сконцентрируйтесь на создании своей «нормальной C ++» DLL без зависимостей Qt.

Как только вы добились успеха, вам больше не нужно изменять файл * .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" с классом и DLL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...