C++ 使用CMake在visual studio 2017中使用boost asio tcp

C++ 使用CMake在visual studio 2017中使用boost asio tcp,c++,boost,cmake,visual-studio-2017,boost-asio,C++,Boost,Cmake,Visual Studio 2017,Boost Asio,我试图在visual studio 2017中使用CMake在一个简单的项目中包括并使用boost ASIO TCP,但我在运行该项目时收到以下错误: LNK1104: cannot open file 'libboost_date_time-vc141-mt-gd-x32-1_67.lib' 以下是准备项目的步骤: LNK1104: cannot open file 'libboost_date_time-vc141-mt-gd-x32-1_67.lib' 更新VS 2017至最新版本15

我试图在visual studio 2017中使用CMake在一个简单的项目中包括并使用boost ASIO TCP,但我在运行该项目时收到以下错误:

LNK1104: cannot open file 'libboost_date_time-vc141-mt-gd-x32-1_67.lib'
以下是准备项目的步骤:

LNK1104: cannot open file 'libboost_date_time-vc141-mt-gd-x32-1_67.lib'
更新VS 2017至最新版本15.7.2 下载boost 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的日期时间库。如您所注意到的,包含不同的头可能会删除此链接依赖项

大多数Boost库都是仅头部的。但有些不是,需要将库添加到目标链接库命令中。对于通过命令find_packageBoost 1.67.0 COMPONENTS找到的所有库,可以执行一次添加所需的系统日期时间

target_link_libraries(${EXEC_NAME} ${Boost_LIBRARIES})
或者添加单个库,如下所示

target_link_libraries(${EXEC_NAME} ${Boost_SYSTEM_LIBRARY} ${Boost_DATE_TIME_LIBRARY})

当您执行此命令时,将include_directories${Boost_include_DIRS}命令转换为特定于目标的目标目录${EXEC_NAME}PUBLIC${Boost_include_DIRS},该命令将CMakeLists.txt中所有目标的Boost include目录添加到特定的目标目录中。是否需要链接PUBLIC/PRIVATE/INTERFACE取决于库/DLL/shared对象是否公开Boost库中的类型。

它正在尝试链接到32位版本的Boost::date\u time。您是将boost库构建为32位还是64位?您需要添加${boost\u libraries}来实现所有请求的boost组件,或者将${boost\u DATE\u TIME\u LIBRARY}添加到您的目标链接\u libraries命令中。我还建议使用target_include_directories${EXEC_NAME}${Boost_include_DIRS}而不是普通的include_directories命令。@kenba我不确定是哪个命令。我的操作系统是windows 10 64位,我只是在VS命令提示符中使用了简单的Bootstrap和b2.exe,没有任何参数。@vre它通过向目标链接库添加${Boost_LIBRARIES}或${Boost_DATE_TIME_LIBRARY}来工作。谢谢尽管如此,target_include_directories${EXEC_NAME}${Boost_include_DIRS}仍会引发一个错误,表示它是用无效参数调用的!是我的错。您应该使用target_include_目录${EXEC_NAME}PUBLIC${Boost_include_DIRS}。有关该命令的更多说明,请参见CMake帮助。