如何在 Ubuntu 14.04 上的 QT creator 中使用 Boost 库

Posted

技术标签:

【中文标题】如何在 Ubuntu 14.04 上的 QT creator 中使用 Boost 库【英文标题】:How to use Boost library in QT creator on Ubuntu 14.04 【发布时间】:2016-09-24 08:12:51 【问题描述】:

我想在 Ubuntu 14.04 上使用 QT creator 中的 C++ Boost 库,尝试了很多方法后,我仍然报错。

我使用以下方式安装了 Boost 库:

sudo apt-get install libboost-all-dev

Boost库安装在目录中:

/usr/include/boost

这是我的 main.cpp

#include <QCoreApplication>
#include<iostream>
#include <boost/asio.hpp>
#include <boost/asio/steady_timer.hpp>

using namespace std;


int main(int argc, char *argv[])

    QCoreApplication a(argc, argv);

    boost::asio::steady_timer timer_;
    timer_.expires_from_now(1000);


    return a.exec();

任何我的 .pro 文件:

QT += core
QT -= gui

CONFIG += c++11

TARGET = test_boost_lib_in_QT
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp

INCLUDEPATH += /usr/include/boost

LIBS += -L/usr/include/boost -lboost_system
LIBS += -L/usr/include/boost  -lboost_chrono
LIBS += -L/usr/include/boost  -lboost_thread
LIBS += -L/usr/include/boost  -lboost_timer

编译错误是:(我使用“ctrl+B”直接从QT编译)

/home/ndn-experiment/Desktop/test_boost_lib_in_QT/main.cpp:13: error: no matching function for call to 'boost::asio::basic_waitable_timer<std::chrono::_V2::steady_clock>::basic_waitable_timer()'
 boost::asio::steady_timer timer_;
                           ^

/home/ndn-experiment/Desktop/test_boost_lib_in_QT/main.cpp:14: error: no matching function for call to 'boost::asio::basic_waitable_timer<std::chrono::_V2::steady_clock>::expires_from_now(int)'
 timer_.expires_from_now(1000);
                             ^

我该怎么办?

【问题讨论】:

首先 - asio 需要 io_service。 stable_timer 没有默认构造函数。第二 - expires_from_now 需要一个持续时间作为参数。 int 参数没有重载。 【参考方案1】:

第一个是因为你需要将io_service传递给构造函数:

boost::asio::io_service io;
boost::asio::steady_timer timer(io);

第二个是因为expires_from_now不带int,它需要一个duration参数:

timer.expires_from_now(boost::posix_time::seconds(5));

检查documentation 也是一个好主意,它有用法示例。

【讨论】:

【参考方案2】:

在网上浏览了这么多帖子,遇到了这么多错误,我终于让我的程序运行起来了。 在此我想回答我自己的问题,强调两点:

    另一种创建类对象的方法,该类的构造函数接受多个参数

    boost::asio::steady_timer的正确使用方法

我的 main.cpp

#include <QCoreApplication>
#include <iostream>
#include <boost/asio.hpp>
#include <boost/asio/steady_timer.hpp>
#include <chrono>
#include <boost/chrono.hpp>

using namespace std;

typedef boost::asio::steady_timer timer_type;

class timer_expire

public:

    timer_expire(boost::asio::io_service& io):timer_(io)

    void timer_expires(int n_milliseconds) 

        timer_.expires_from_now(boost::chrono::milliseconds(n_milliseconds));

        //need timer_.async_wait() here

    

private:
    timer_type timer_;
;



int main(int argc, char *argv[])

    QCoreApplication a(argc, argv);

    boost::asio::io_service io;

    timer_expire timer_expire_(io);
    timer_expire_.timer_expires(10000);

    return a.exec();

我的 .pro 文件(请注意QMAKE_CXXFLAGS

QT += core
QT -= gui

CONFIG += c++11

TARGET = test_boost_lib_in_QT
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp

CONFIG += c++11

QMAKE_CXXFLAGS += -std=c++11

INCLUDEPATH += /usr/include/boost

QMAKE_CXXFLAGS += -DBOOST_ASIO_DISABLE_STD_CHRONO
LIBS += -L/usr/include/boost -lboost_system -lboost_chrono -lboost_thread -lboost_timer

我的g++ 版本是4.8.4

注意boost::asio::steady_timer还有另一种方法,将QMAKE_CXXFLAGS设置为-DBOOST_ASIO_HAS_STD_CHRONO,请参考post。

也可以看看Chrono。

【讨论】:

您的包装类很糟糕,因为它确实隐藏了持续时间的类型。原来的界面你可以通过几小时、几秒等等。您的界面没有给出任何提示,它需要几毫秒,而原来的界面是类型安全的。 @stefan 只是一个玩具类,用于展示如何成功编译 boost::asio::steady_timer

以上是关于如何在 Ubuntu 14.04 上的 QT creator 中使用 Boost 库的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu 14.04 上的“未安装模块 QtQuick.Controls”错误

如何在 ubuntu 14.04 上安装 QtSvg、QtWebKit、QtWebKitWidgets(全部为 Qt5 版本)?

在 ubuntu14.04 上启动 qt

在 Ubuntu 14.04 上安装 Qt 5.5.1 - 在终端上抛出 qt.network.ssl 错误

QT5.12 qtcreate 在Ubuntu14.04

QSystemTrayIcon 未显示在 Ubuntu 14.04 的通知区域中