2016-09-24 3 views
3

Я хочу использовать библиотеку C++ Boost в создателе QT на Ubuntu 14.04, после многих методов я все равно получаю ошибки.Как использовать библиотеку Boost в создателе QT на Ubuntu 14.04

Я установил библиотеку Boost, используя:

sudo apt-get install libboost-all-dev 

Библиотека подталкивания устанавливается в каталоге:

/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 file:

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 

составителя ошибки являются: (я составил непосредственно из QT с помощью "Ctrl + B")

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

Что я должен делать?

+0

для первого требует использования io_service. конструктор default_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 :: stable_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

Смежные вопросы