2012-07-30 74 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