如何在 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 版本)?