在Visual Studio 2017中使用boost asio tcp与CMake

Using boost asio tcp in visual studio 2017 with CMake

本文关键字:asio boost tcp CMake Visual Studio 2017      更新时间:2023-10-16

我正在尝试使用 CMake 在 Visual Studio 2017 中的简单项目中包含和使用 boost ASIO TCP,但在运行项目时收到此错误:

LNK1104: cannot open file 'libboost_date_time-vc141-mt-gd-x32-1_67.lib'

以下是准备项目的步骤:

  1. 将 VS 2017 更新到最新版本 (15.7.2(
  2. 下载增强版 1.67.0
  3. 在 VS 命令提示符下运行引导程序和 b2.exe
  4. 在环境变量中定义Boost_ROOT
  5. 在 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 库中的类型。