如何在 Qt Creator 中仅包含 boost header 库

How to include boost header only library in Qt Creator

我正在尝试使用 Qt Creator 项目包含一个仅限 header 的库,特别是 <boost/variant>

这是我添加到 .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.

如何在不包含整个 /usr/include/ 的情况下正确地允许 <boost/variant.hpp> 样式导入工作?

最小示例代码:

# 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 {
}

谢谢。

这条语句:

#include <variant>

正在为变体引入标准 C++ header 文件,并让您的代码访问 std::variant,而不是 Boost 版本。

这条语句:

#include <boost/variant>

可能无法编译 - 因为 /usr/include/boost/variant 本身就是目录,而不是可以包含的文件。

如果您想要 variant header 的 Boost 版本,我想您需要在您的 .cpp 文件中:

#include <boost/variant.hpp>

假设 /usr/include/boost 文件夹存在,您就不必弄乱 INCLUDEPATH

更新 假设 /usr/include 是冲突 header 文件的来源,您可以尝试做一个符号链接以从不同的文件夹提升。

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

中的其他地方而不会发生潜在冲突