如何在Qt Creator中包含仅提升标头库

How to include boost header only library in Qt Creator

本文关键字:包含仅 Qt Creator      更新时间:2023-10-16

我正在尝试使用Qt Creator项目包含一个仅提升标头库,特别是<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.

如何正确允许<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 {
}

谢谢。

此语句:

#include <variant>

正在为变体拉入 std C++头文件,并允许您的代码访问 std::variant,而不是 Boost 版本。

此声明:

#include <boost/variant>

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

如果你想要variant标头的 Boost 版本,我认为您希望在 .cpp 文件中使用它:

#include <boost/variant.hpp>

而且,假设/usr/include/boost文件夹存在,您不应该弄乱您的INCLUDEPATH

更新假设/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其他地方发生潜在冲突