簡體   English   中英

包含boost / thread.cpp時的編譯錯誤

[英]Compilation error when including boost/thread.cpp

我有以下代碼使用Boost ASIO來設置TCP客戶端。 這是我的代碼改編自Boost doc的聊天示例

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();
}

當然,我需要在類Connection中使用boost / thread來聲明變量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 (*)()]’

如果我將include移除到boost / thread.hpp,並通過對io_service.run()的簡單調用將聲明替換為t,它將編譯並工作; 我想知道這個編譯錯誤是否與boost版本有關。 我正在使用Boost ASIO 1.42,Ubuntu 11.04和Eclipse,如果這些有任何幫助的話。 先感謝您。

我寫了一個包含單個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也可以正常工作

所以我建議你使用更新版本的boost。 您不必在系統范圍內安裝它,而是可以為單個用戶安裝它。 所以你不依賴於ubuntu包。

要手動安裝boost,我建議您按照Unix Variants入門指南進行操作

  1. boost_1_50_0.tar.bz2到一些臨時源目錄並進入cd
  2. 使用./bootstrap.sh --prefix=${HOME}/boost_1_50 && ./b2 install 構建和安裝 ./bootstrap.sh --prefix=${HOME}/boost_1_50 && ./b2 install
  3. 使用-I ${HOME}/boost_1_50 編譯您的應用程序以獲取正確的標頭
  4. 鏈接應用程序時包含${HOME}/boost_1_50/lib/libboost_thread.a作為參數

使用靜態libboost_thread.a而不是動態libbtoost_thread.so將確保您不必擔心定位庫以啟動應用程序。 您需要的所有內容都將包含在您的主二進制文件中。

按照C ++ 11標准的@MvG推理,我做了一些研究。 似乎這是Ubuntu Natty提供的gcc和boost之間的協調問題 ,它分別使用-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。

經過多次探索,按照@MvG的建議,我通過以下方式成功編譯並鏈接了我的簡單程序:

  • 手動構建並安裝boost 1.50(使用MvG建議)
  • 使用以下2個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編譯時遇到了困難,但這是另一個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM