2012-07-30 73 views
1

我有以下代碼使用Boost ASIO來設置TCP客戶端。這裏是我的代碼改編自Boost doc的chat example包括boost/thread.cpp時編譯錯誤

class AsioCommunicationService { 
AsioCommunicationService::AsioCommunicationService(
     boost::asio::io_service& io_service, 
     tcp::resolver::iterator endpoint_iterator) 
    : io_service_(io_service), 
     socket_(io_service) 
{ 
    tcp::endpoint endpoint = *endpoint_iterator; 
    socket_.async_connect(endpoint, 
    boost::bind(&AsioCommunicationService::handle_connect, this, 
    boost::asio::placeholders::error, ++endpoint_iterator)); 
} 

void AsioCommunicationService::handle_connect(const boost::system::error_code& error, 
     tcp::resolver::iterator endpoint_iterator) 
{ 
    if (!error) 
    { 
     boost::asio::async_read(socket_, 
      boost::asio::buffer(read_msg_.data(), LampMessage::header_length), 
      boost::bind(&AsioCommunicationService::handle_read_header, this, 
      boost::asio::placeholders::error)); 
    } 
} 
} 


class Connection 
{ 
    //init io_service, query, resolve, iterator here 
    boost::asio::io_service io_service; 
    boost::asio::ip::tcp::resolver resolver(io_service); 
    boost::asio::ip::tcp::resolver::query query(host, service); 
    boost::asio::ip::tcp::resolver::iterator endpoint_iterator = 
    resolver.resolve(query); 


    m_session = std::shared_ptr<AsioCommunicationService>(
      new AsioCommunicationService(io_service, iterator)); 

    //start new thread for io_service.run --> GOT AN ERROR when include boost/thread.hpp 
    boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service)); 

    //this synchronous command would work, but it's blocking the program. I don't want that. 
    //io_service.run(); 
} 

當然,我需要包含boost/thread來聲明類Connection的變量t。但是,當我這樣做,我得到這個錯誤

#include <boost/thread.hpp> 
//ERROR: In function ‘boost::thread&& boost::move(boost::thread&&)’: 
///usr/include/boost/thread/detail/thread.hpp:349:16: error: invalid initialization of reference of type ‘boost::thread&&’ from expression of type ‘boost::thread’ 
//In file included from /usr/include/boost/thread/detail/thread_heap_alloc.hpp:17:0, 
//    from /usr/include/boost/thread/detail/thread.hpp:13, 
//    from /usr/include/boost/thread/thread.hpp:22, 
//    from /usr/include/boost/thread.hpp:13, 
//    from /home/son/dev/logistics/src/frameworks/networkService/NetworkConnection.cpp:13: 
///usr/include/boost/thread/pthread/thread_heap_alloc.hpp: In function ‘T* boost::detail::heap_new(A1&&) [with T = boost::detail::thread_data<void (*)()>, A1 = void (*&)()]’: 
///usr/include/boost/thread/detail/thread.hpp:130:95: instantiated from here 
///usr/include/boost/thread/pthread/thread_heap_alloc.hpp:24:47: error: cannot bind ‘void (*)()’ lvalue to ‘void (*&&)()’ 
///usr/include/boost/thread/detail/thread.hpp:43:13: error: initializing argument 1 of ‘boost::detail::thread_data<F>::thread_data(F&&) [with F = void (*)()]’ 

這將編譯,如果我刪除包括推動/ thread.hpp,並更換聲明通過簡單的調用噸至io_service.run工作() ;我想知道這個編譯錯誤是否與boost版本有關。如果有任何幫助,我使用Boost ASIO 1.42,Ubuntu 11.04和Eclipse。先謝謝你。

+0

你可以嘗試去掉一個小的自包含的例子,讓人們可以試驗它嗎? – MvG 2012-07-30 22:07:26

+0

Boost 1.42相當過時(從2010年afaics)。至少有一些錯誤消息引用了右值引用,這些引用是C++ 11標準的一部分,並且在那個時候肯定已經非常流行。可能還有一些粗糙的邊緣。我會嘗試最新版本的boost,看看是否能解決您的問題。 – MvG 2012-07-30 22:19:19

+0

感謝@MvG,基本上當我把include 放入我的代碼時,我得到了那些錯誤。其餘的並不關心我的想法。 – 2012-07-31 08:12:14

回答

0

多的摸索,下面@MvG建議,我成功地編譯和鏈接我的簡單的程序,通過執行以下操作:(MVG使用建議)

  • 編譯和鏈接

    • 手動編譯和安裝升壓1.50源代碼使用以下兩個make文件(1代表靜態,1代表動態鏈接)。

    動態:

    default: test 
    
    test.o: test.cpp 
        g++-4.5 -std=c++0x -I /home/son/boost_1_50/include/ -c test.cpp 
    
    test: test.o   
        g++-4.5 -std=c++0x -L /home/son/boost_1_50/lib/ test.o -lboost_thread -lboost_system -lboost_chrono -pthread -o test 
    
    run: test 
        LD_LIBRARY_PATH=/home/son/boost_1_50/lib/ ./test 
    

    靜態:

    default: test 
    
    test.o: test.cpp 
        g++-4.5 -std=c++0x -I /home/son/boost_1_50/include/ -c test.cpp 
    
    test: test.o 
        g++-4.5 -std=c++0x -L /home/son/boost_1_50/lib/ test.o -static -lboost_thread -lboost_system -lboost_chrono -pthread -o test 
    
    run: test 
        ./test 
    

    的TEST.CPP文件如下。

    #include <boost/thread.hpp> 
    #include <stdio.h> 
    
    int main() 
    { 
        printf("boost thread tested by son\n"); 
        boost::thread t; 
        return 0; 
    } 
    

    就是這樣。我在編譯CMake時遇到了困難,但這是另一個問題。

  • +0

    「靜態」鏈接不僅在靜態增強鏈接中,而且大部分libc和libstdC++也是如此。不知道這是否是一個好主意。 – MvG 2012-08-03 10:02:53

    +0

    是啊,靜態地直接連接到.a,正如你解釋的是另一種替代方式。謝謝。 – 2012-08-06 10:16:04

    1

    繼C++ 11標準的@MvG推理之後,我做了一些研究。它似乎是在Ubuntu Natty提供的gcc和boost之間的a problem of coordination,它分別使用-std = C++ 0x和libboost1.42。

    沒有解決方案,但我使用了這種解決方法:在/usr/include/boost/config/compiler/gcc.hpp中註釋掉# define BOOST_HAS_RVALUE_REFS,如下所示。

    #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)) && defined(__GXX_EXPERIMENTAL_CXX0X__) 
    // C++0x features are only enabled when -std=c++0x or -std=gnu++0x are 
    // passed on the command line, which in turn defines 
    // __GXX_EXPERIMENTAL_CXX0X__. 
    # define BOOST_HAS_DECLTYPE 
    //# define BOOST_HAS_RVALUE_REFS 
    # define BOOST_HAS_STATIC_ASSERT 
    # define BOOST_HAS_VARIADIC_TMPL 
    #else 
    

    我的代碼編譯像魔術現在:)謝謝@MvC。

    3

    我寫了一個文件,其中包含一個include指令:

    #include <boost/thread.hpp> 
    
    • g++-4.5.4 -std=c++0x -I /usr/include/boost-1_42 -c給了你提到的錯誤。
    • g++-4.6.3 -std=c++0x -I /usr/include/boost-1_42 -c相同
    • g++-4.7.1 -std=c++0x -I /usr/include/boost-1_42 -c了更加錯誤
    • g++-4.7.1 -std=c++0x -I /usr/include/boost-1_49 -c已經不是單一錯誤
    • g++-4.6.3g++-4.5.4也使用boost 1.49

    沒有錯誤工作,所以我真的建議你使用這是一個更新的版本。您不必在系統範圍內安裝它,而是可以爲單個用戶安裝它。所以你不依賴於Ubuntu軟件包。

    要手動安裝升壓,我建議你遵循Getting Started on Unix Variants指南:

    1. 解壓boost_1_50_0.tar.bz2一些臨時的源目錄和cd
    2. Build and install使用./bootstrap.sh --prefix=${HOME}/boost_1_50 && ./b2 install
    3. Compile使用-I ${HOME}/boost_1_50,讓您的應用程序正確的標題
    4. 包括${HOME}/boost_1_50/lib/libboost_thread.a作爲參數linking您的應用程序

    使用靜態libboost_thread.a,而不是動態libbtoost_thread.so將確保您不必擔心定位庫來啓動應用程序。一切從你需要的提升都將包含在你的主要二進制文件中。

    +0

    謝謝。你是怎麼建議我在我的ubuntu natty上安裝boost 1.49或1.50的?我似乎無法找到它的ppa。我應該下載並重新編譯boost嗎? – 2012-07-31 12:20:47

    +0

    @SonDo,我在我的答案中包含了關於安裝boost的快速指南。 – MvG 2012-07-31 12:47:22

    +0

    謝謝@MvG。我成功構建並安裝了boost(但我忽略了一些,並跳過了,我不知道爲什麼)。然後用這個「g ++ - 4.5 -std = C++ 0x -I $ {HOME}/boost_1_50 test.cpp -c」編譯我的示例代碼仍然給我提供了同樣的錯誤。嗯,我現在變得非常生氣,花了2天時間沒有任何進展。如果你能幫我弄清楚,我真的很感激。 – 2012-07-31 16:01:44