代码之家  ›  专栏  ›  技术社区  ›  Mahdi

在带有cmake的Visual Studio 2017中使用Boost ASIO TCP

  •  0
  • Mahdi  · 技术社区  · 7 年前

    我正在尝试在带有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_根
    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;
    }
    

    1 回复  |  直到 7 年前
        1
  •  1
  •   vre    7 年前

    把我的评论变成一个答案:

    缺少将可执行文件链接到 date_time Boost图书馆。如您注意到的,包含不同的头可能会删除此链接依赖项。

    大多数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 include目录添加到 CMakeLists.txt 进入特定目标 target_include_directories(${EXEC_NAME} PUBLIC ${Boost_INCLUDE_DIRS}) . 如果需要链接 PUBLIC/PRIVATE/INTERFACE 取决于库/dll/共享对象是否公开来自boost库的类型。