在Visual Studio 2017中使用boost asio tcp与CMake
Using boost asio tcp in visual studio 2017 with CMake
我正在尝试使用 CMake 在 Visual Studio 2017 中的简单项目中包含和使用 boost ASIO TCP,但在运行项目时收到此错误:
LNK1104: cannot open file 'libboost_date_time-vc141-mt-gd-x32-1_67.lib'
以下是准备项目的步骤:
- 将 VS 2017 更新到最新版本 (15.7.2(
- 下载增强版 1.67.0
- 在 VS 命令提示符下运行引导程序和 b2.exe
- 在环境变量中定义Boost_ROOT
- 在 VS 中创建 CMake 项目
那么这是我的CMakeList.text:
cmake_minimum_required (VERSION 3.8)
project (TcpSample)
set(EXEC_NAME "TcpSample")
add_executable (${EXEC_NAME} "TcpSample.cpp" "TcpSample.h")
SET(BOOST_MANDATORY_COMPONENTS system date_time)
set(Boost_USE_STATIC_LIBS ON)
find_package(Boost "1.67.0" COMPONENTS ${BOOST_MANDATORY_COMPONENTS}
REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(${EXEC_NAME} ${Boost_SYSTEM_LIBRARY})
最后是代码:
#include "TcpSample.h"
#include <boost/asio/ip/tcp.hpp>
using namespace std;
int main()
{
cin.get();
return 0;
}
我需要提一下,如果我将 tcp 更改为 udp,则没有错误。
将我的评论转换为答案:
您缺少将可执行文件链接到 Boost 的date_time
库。正如您所注意到的,包含不同的标头可能会删除此链接依赖项。
大多数 Boost 库仅是标头。但有些不是,需要将库添加到target_link_libraries
命令中。对于命令找到的所有库,只需一次,find_package(Boost "1.67.0" COMPONENTS system date_time REQUIRED)
通过添加
target_link_libraries(${EXEC_NAME} ${Boost_LIBRARIES})
或添加单个库,如下所示
target_link_libraries(${EXEC_NAME} ${Boost_SYSTEM_LIBRARY} ${Boost_DATE_TIME_LIBRARY})
当您使用它时,将命令include_directories(${Boost_INCLUDE_DIRS})
将 Boost 包含目录添加到CMakeLists.txt
中的所有目标中,转换为目标特定的target_include_directories(${EXEC_NAME} PUBLIC ${Boost_INCLUDE_DIRS})
。是否需要链接PUBLIC/PRIVATE/INTERFACE
取决于库/DLL/共享对象是否公开 Boost 库中的类型。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 从 Boost ASIO 获取 epoll 描述符 io_service对象
- 如何在 Boost.Asio 中使用 Zero-copy sendmsg/receive
- C++ Boost::asio串行通信与Arduino无法写入
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 执行时使用 boost::asio::d eadline_timer 时出错
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- boost::asio data owning `ConstBufferSequence`
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 如何将boost::asio::d eadline_timer 与Qt一起使用?
- 将更高的优先级设置为 boost::asio 线程处理进程
- Async_read_until限制读取的字节大小(Boost::asio)
- Boost Asio - boost::bind 导致程序崩溃
- 使用Asio(Boost)通过网络发送灵活的数据量