Debian下C++ Boost编译报错:asio::basic_datagram_socket无get_io_service成员
解决Boost.Asio中
get_io_service()编译报错的问题 这问题我之前碰到过好几次,其实解决起来很直接——get_io_service()是Asio里被标记为废弃的接口,你的编译环境可能默认开启了废弃接口屏蔽,所以才会报“没有该成员”的错误。要启用它,只需要让#if !defined(ASIO_NO_DEPRECATED)这个条件编译块生效就行,具体有几种方式:
方法1:在代码中提前定义宏
在包含任何Boost/Asio或者第三方库的头文件之前,添加宏定义:
#define ASIO_NO_DEPRECATED 0 #include <boost/asio.hpp> // 接着包含你的第三方库头文件
这样编译器处理到Asio的头文件时,会识别到ASIO_NO_DEPRECATED被定义为0,逻辑上等价于“未定义该宏”,从而启用废弃的get_io_service()函数。
方法2:在编译命令中添加宏参数
如果是直接用g++/clang++编译,在命令行里加上-DASIO_NO_DEPRECATED=0参数:
g++ -DASIO_NO_DEPRECATED=0 your_source.cpp -o your_app -lboost_system -lboost_thread
这个参数会告诉编译器全局定义该宏,效果和在代码里定义完全一致。
方法3:用CMake构建时配置宏
如果你的项目用CMake管理,在CMakeLists.txt里添加:
# 针对单个目标(推荐,避免影响其他代码) target_compile_definitions(your_target_name PRIVATE ASIO_NO_DEPRECATED=0) # 或者全局生效(不推荐,可能干扰其他依赖) # add_definitions(-DASIO_NO_DEPRECATED=0)
额外说明
虽然这个方法能解决编译问题,但要注意:get_io_service()已经被Asio官方废弃,推荐的替代接口是get_executor().context()。不过你是编译第三方库,没法修改库的代码,所以启用废弃接口是当前最直接的解决方案。
内容的提问来源于stack exchange,提问作者Vladimir Yanakiev
相关产品推荐
相关产品推荐

