【问题标题】:Using boost asio tcp in visual studio 2017 with CMake在 Visual Studio 2017 中通过 CMake 使用 boost asio tcp
【发布时间】:2018-05-29 20:46:47
【问题描述】:

我正在尝试在 Visual Studio 2017 中使用 CMake 的一个简单项目中包含和使用 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 中创建 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 的 32 位版本。您将 boost 库构建为 32 位还是 64 位?
  • 您需要添加 ${Boost_LIBRARIES} 来满足您请求的所有 Boost 组件或添加 ${Boost_DATE_TIME_LIBRARY} 到您的 target_link_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_link_libraries 来工作。谢谢!虽然, target_include_directories(${EXEC_NAME} ${Boost_INCLUDE_DIRS}) 引发了一个错误,说它是用无效参数调用的!
  • 我的错。您应该改用target_include_directories(${EXEC_NAME} PUBLIC ${Boost_INCLUDE_DIRS})。有关该命令的进一步说明,请参阅 CMake 帮助。

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


【解决方案1】:

把我的 cmets 变成一个答案:

您缺少将可执行文件链接到 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})

当您使用它时,将向CMakeLists.txt 中的所有目标添加Boost 包含目录的命令include_directories(${Boost_INCLUDE_DIRS}) 转换为特定于目标的target_include_directories(${EXEC_NAME} PUBLIC ${Boost_INCLUDE_DIRS})。是否需要链接 PUBLIC/PRIVATE/INTERFACE 取决于您的库/DLL/共享对象是否公开了 Boost 库中的类型。

【讨论】:

    猜你喜欢
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多