2016-09-24 75 views
3

我想在Ubuntu 14.04上的QT創建器中使用C++ Boost庫,嘗試了很多方法後,仍然出現錯誤。如何在Ubuntu的QT創建器中使用Boost庫14.04

我安裝使用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 

的編譯錯誤是:

/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); 
          ^

我應該怎麼做(用 「CTRL + B」 我直接從QT編譯)?

+0

首先 - asio需要一個io_service。 steady_timer沒有默認構造函數。 second - expires_from_now要求持續時間作爲參數。 int參數沒有重載。 – stefan

回答

0

經歷了互聯網上的這麼多帖子和我遇到的很多錯誤之後,我終於使我的程序運行。 這裏,我想回答我的問題,強調了兩點:

  1. 創建一個類,它的構造函數的對象的另一種方法需要超過1個參數

  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

+0

你的包裝類很糟糕,因爲它隱藏了持續時間的類型。您可以通過小時,秒等原始界面。你的界面沒有給出任何提示,它需要幾毫秒,而原來的是類型安全的。 – stefan

+0

@stefan只是一個玩具類,展示如何成功地編譯** boost :: asio :: steady_timer **。 – Bloodmoon

2

第一個是因爲你需要傳遞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也是一個很好的總體思路,它有使用示例。

+0

謝謝,請看看我的答案。 – Bloodmoon