Как включить в Qt Creator библиотеку только для заголовков - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь включить библиотеку только для наддува заголовка, в частности, <boost/variant>, используя проект Qt Creator.

Это то, что я добавил в мой .pro файл:

INCLUDEPATH += /usr/include/boost \

Теперь, если я зайду в файл .cpp и попробую включить ..

#include <variant.hpp>

работает, но

#include <boost/variant.hpp>

нет.

Это имеет смысл, так как я добавляю /usr/include/boost/, а не /usr/include. Тем не менее, если я вместо этого

INCLUDEPATH += /usr/include

Я получаю массу ошибок, связанных с cmath, которые, кажется, связаны с добавлением /usr/include к пути включения - https://github.com/android-ndk/ndk/issues/452

Если я просто наберу #include <variant.hpp> в своем коде, то код повышения жалуется - 'boost/variant/variant.hpp' file not found.

Как правильно разрешить импорт стиля <boost/variant.hpp> для работы без включения всего /usr/include/?

Минимальный пример кода:

# Example.pro
QT += quick
CONFIG += c++17

SOURCES += \
        main.cpp

RESOURCES += qml.qrc

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
// main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>

#include <boost/variant.hpp>

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

qml.qrc

<RCC>
    <qresource prefix="/">
        <file>main.qml</file>
        <file>main.qml</file>
    </qresource>
</RCC>
// main.qml
import QtQuick 2.12
import QtQuick.Controls 2.5

ApplicationWindow {
}

Спасибо.

1 Ответ

1 голос
/ 04 мая 2019

Это утверждение:

#include <variant>

Получает заголовочный файл std C ++ для варианта и предоставляет вашему коду доступ к std :: варианту , а не к версии Boost.

Это утверждение:

#include <boost/variant>

Скорее всего, не скомпилируется - потому что /usr/include/boost/variant - это сам каталог, а не файл, который можно включить.

Если вам нужна Boost-версия заголовка variant, я думаю, вы хотите это в своем файле .cpp:

#include <boost/variant.hpp>

И вам не нужно связываться с INCLUDEPATH, если папка /usr/include/boost существует.

Обновление Предполагая, что / usr / include является источником конфликтующих заголовочных файлов, вы можете попробовать использовать символическую ссылку для увеличения из другой папки.

cd                              # cd to home directory
mkdir include                   # create a local "include" folder
cd include                      # cd to this folder
ln -s /usr/include/boost boost  # create a symlink to boost

Затем обновите ваш путь включения, чтобы он указывал на этот каталог

INCLUDEPATH += /home/yourname/include

Где /home/yourname - ваш домашний каталог.

Это позволит вам использовать <boost/variant.hpp> без потенциальных конфликтов в других местах /usr/include

...