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

时间:2018-05-29 20:46:47

标签: c++ boost cmake visual-studio-2017 boost-asio

我试图在使用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. 下载boost 1.67.0
  3. 在VS命令提示符下运行Bootstrap和b2.exe
  4. 在环境变量中定义Boost_ROOT
  5. 在VS
  6. 中创建一个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,则没有错误。

1 个答案:

答案 0 :(得分:1)

将我的评论转到答案:

您缺少将可执行文件链接到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})命令添加到CMakeLists.txt的所有目标中的Boost包含目录,转换为特定目标target_include_directories(${EXEC_NAME} PUBLIC ${Boost_INCLUDE_DIRS})。如果需要链接PUBLIC/PRIVATE/INTERFACE取决于您的库/ DLL /共享对象是否公开Boost库中的类型。