用gcc编译asio

时间:2015-09-30 15:09:09

标签: c++ gcc boost-asio

我尝试使用gcc从此处http://think-async.com/Asio/asio-1.11.0/doc/asio/examples/cpp11_examples.html#asio.examples.cpp11_examples.http_server编译HTTP Server。 我用了

 g++ main.cpp -std=c++11 -I/home/gabi/Downloads/asio-1.11.0/include -pthread

我明白了

/tmp/ccE1vIzF.o: In function `http::server::server::server(std::string const&, std::string const&, std::string const&)':
server.cpp:(.text+0x1a3): undefined reference to `http::server::connection_manager::connection_manager()'
server.cpp:(.text+0x1e0): undefined reference to `http::server::request_handler::request_handler(std::string const&)'
/tmp/ccE1vIzF.o: In function `http::server::server::do_accept()::{lambda(std::error_code)#1}::operator()(std::error_code) const':
server.cpp:(.text+0x52a): undefined reference to `http::server::connection_manager::start(std::shared_ptr<http::server::connection>)'
/tmp/ccE1vIzF.o: In function `http::server::server::do_await_stop()::{lambda(std::error_code, int)#1}::operator()(std::error_code, int) const':
server.cpp:(.text+0x5e9): undefined reference to `http::server::connection_manager::stop_all()'
/tmp/ccE1vIzF.o: In function `_ZN9__gnu_cxx13new_allocatorIN4http6server10connectionEE9constructIS3_IN4asio19basic_stream_socketINS6_2ip3tcpENS6_21stream_socket_serviceIS9_EEEERNS2_18connection_managerERNS2_15request_handlerEEEEvPT_DpOT0_':
server.cpp:(.text._ZN9__gnu_cxx13new_allocatorIN4http6server10connectionEE9constructIS3_IN4asio19basic_stream_socketINS6_2ip3tcpENS6_21stream_socket_serviceIS9_EEEERNS2_18connection_managerERNS2_15request_handlerEEEEvPT_DpOT0_[_ZN9__gnu_cxx13new_allocatorIN4http6server10connectionEE9constructIS3_IN4asio19basic_stream_socketINS6_2ip3tcpENS6_21stream_socket_serviceIS9_EEEERNS2_18connection_managerERNS2_15request_handlerEEEEvPT_DpOT0_]+0x8b): undefined reference to `http::server::connection::connection(asio::basic_stream_socket<asio::ip::tcp, asio::stream_socket_service<asio::ip::tcp> >, http::server::connection_manager&, http::server::request_handler&)'
collect2: error: ld returned 1 exit status

有谁知道为什么? 如果我尝试编译http://think-async.com/Asio/asio-1.11.0/doc/asio/examples/cpp11_examples.html#asio.examples.cpp11_examples.allocation作品。

2 个答案:

答案 0 :(得分:2)

你应该编译所有的cpp文件 - 不仅仅是main.cpp。

答案 1 :(得分:1)

首先,请允许我说您似乎提供了错误的编译命令来生成该错误消息,因为错误消息表明您正在编译server.cpp,例如:

server.cpp:(.text+0x1a3): undefined reference to 'http::server::connection_manager::connection_manager()'

当你真的没有。实际上,您只编译main.cpp,因为这是您提供的编译命令中唯一的cpp文件。

另一个答案指出,您需要为HTTP服务器编译所有的.cpp文件,而不仅仅是main.cpp。为此,您只需将所有.cpp文件传递给g++命令:

g++ main.cpp connection.cpp connection_manager.cpp mime_types.cpp reply.cpp request_handler.cpp request_parser.cpp server.cpp -std=c++11 -I/home/gabi/Downloads/asio-1.11.0/include -pthread

最后,与另一个答案所说的相反,需要链接任何库,因为Asio是一个仅限标头的库。但是,Boost.Asio不是仅限标头,所以如果你正在使用Boost.Asio,你需要使用以下链接器标志链接到Boost'系统'库:

-L/path/to/folder/containing/Boost/libs/ -lboost_system

(假设Boost库未安装在标准系统位置,例如/lib;如果是,则可以省略-L标志。正如评论中所述, -lboost_system告诉链接器(ld)查找名为libboost_system.so的库。有关ld如何找到的更多信息,请参阅ld man page库)。

但是,正如你所说的那样,你只使用Asio而不是Boost.Asio,只需包含相应的.hpp头文件并使用-I编译器标志指向头文件即可位置。