我尝试使用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作品。
答案 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
编译器标志指向头文件即可位置。