C++ 用gcc编译asio

C++ 用gcc编译asio,c++,gcc,boost-asio,C++,Gcc,Boost Asio,我试图用gcc从这里编译HTTP服务器。 我曾经 我明白了 /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::con

我试图用gcc从这里编译HTTP服务器。 我曾经

我明白了

/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
/tmp/ccE1vIzF.o:在函数“http::server::server::server(std::string const&,std::string const&,std::string const&”)中:
server.cpp:(.text+0x1a3):对“http::server::connection\u manager::connection\u manager()”的未定义引用
server.cpp:(.text+0x1e0):对“http::server::request\u handler::request\u handler(std::string const&)”的未定义引用
/tmp/ccE1vIzF.o:在函数“http::server::server::do_accept()::{lambda(std::error_code)#1}::operator()(std::error_code)const”中:
server.cpp:(.text+0x52a):对“http::server::connection\u manager::start(std::shared\u ptr)”的未定义引用
/tmp/ccE1vIzF.o:在函数'http::server::server::do_wait_stop():{lambda(std::error_code,int)#1}::operator()(std::error_code,int)const'中:
server.cpp:(.text+0x5e9):对“http::server::connection\u manager::stop\u all()”的未定义引用
/tmp/CCE1 VIZF.o:在函数“新分配器4 TTP6服务器10连接EE9构造为基本流式插口6流式插口服务为连接管理器请求句柄EEVPT DpOT0”中:

server.cpp:(.text.\u ZN9\u gnu\u cx13新的\u分配器4 TTP6服务器10连接EE9构造为基本流\u套接字6 \u 2 TCPens6 \u 21流\u套接字\u服务为EEERNS2 \u 18连接管理器NS2 \u 15请求\u句柄EEVPT \u DpOT0_[\u ZN9\u gnu\u cxx13新的分配器4http6服务器10connectionee9constructionis3\u IN4asio19basic\u stream\u sockets6\u 2ip3tcpENS6\u 21 stream\u socket\u services9\u eerns2\u 18连接\u 15请求\u handlerEEVPT\u DpOT0\u8]+0x8b):未定义对“http::server::connection::connection::connection::connection::connection”的引用(asio::basic_stream_socket工作。

您应该编译所有cpp文件,而不仅仅是main.cpp。

您应该编译所有cpp文件,而不仅仅是main.cpp。

首先,让我说,您似乎提供了错误的编译命令来生成错误消息,因为错误消息表明您正在编译
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“System”库:

-L/path/to/folder/containing/Boost/libs/-lboost\u系统

(这是假设Boost库未安装在标准系统位置,如
/lib
;如果安装在标准系统位置,则可以省略
-L
标志。如注释中所述,
-lboost_system
告诉链接器(
ld
)查找名为
libboost\u system.so
的库。有关
ld
如何查找库的更多信息,请参阅
ld
。)


但是,正如您所说,由于您只使用Asio而不是Boost.Asio,因此您可以只包含适当的.hpp头文件,并使用
-I
编译器标志来指向头文件位置。

首先,我要说的是,您似乎提供了错误的编译命令来生成错误消息,si错误消息表明您正在编译
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“System”库:

-L/path/to/folder/containing/Boost/libs/-lboost\u系统

(这是假设Boost库未安装在标准系统位置,如
/lib
;如果安装在标准系统位置,则可以省略
-L
标志。如注释中所述,
-lboost_system
告诉链接器(
ld
)查找名为
libboost\u system.so
的库。有关
ld
如何查找库的更多信息,请参阅
ld
。)


但是,正如您所说,因为您只使用Asio而不是Boost.Asio,所以您可以只包含适当的.hpp头文件,并使用
-I
编译器标志来指向头文件位置。

-对于Boost构建系统有makefile。但是我使用版本非Boost-对于Boost构建系统有makefile。但是使用非BoostVersion获取一些IDE来帮助您完成此任务。或者学习如何使用makefile。获取一些IDE来帮助您完成此任务。或者学习如何使用makefile。为什么需要将server.cpp添加到编译行?链接器在server.cpp中报告错误,所以看起来它已经被拉入了。@DmitryRubanovich您说得对。但是基于OP的编译命令,他们没有拉入server.cpp,因此他们粘贴的编译命令必须与实际用于产生此错误的编译命令不同。我将据此编辑我的答案为什么需要将server.cpp添加到编译行?链接器正在server.cpp中报告错误,因此看起来是l好像它已经被拉进来了。@DmitryRubanovich你是对的。但是