在 visual studio 2017 年通过 CMake 使用 boost asio tcp
Using boost asio tcp in visual studio 2017 with CMake
我试图在 visual studio 2017 年的一个简单项目中使用 CMake 包含和使用 boost ASIO TCP,但是当我 运行 项目时收到此错误:
LNK1104: cannot open file 'libboost_date_time-vc141-mt-gd-x32-1_67.lib'
这些是准备项目的步骤:
- 将 VS 2017 更新到最新版本 (15.7.2)
- 下载 boost 1.67.0
- 在 VS 命令提示符中 运行 Bootstrap 和 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,是没有错误的。
将我的评论变成答案:
您缺少 link 您的可执行文件到 Boost 的 date_time
库。如您所见,包含一个不同的 header 可能会消除这种 link 依赖性。
大多数 Boost 库仅 header。但有些不是,需要将库添加到 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})
。如果您需要 link PUBLIC/PRIVATE/INTERFACE
取决于您的 library/DLL/shared object 是否公开了 Boost 库中的类型。
我试图在 visual studio 2017 年的一个简单项目中使用 CMake 包含和使用 boost ASIO TCP,但是当我 运行 项目时收到此错误:
LNK1104: cannot open file 'libboost_date_time-vc141-mt-gd-x32-1_67.lib'
这些是准备项目的步骤:
- 将 VS 2017 更新到最新版本 (15.7.2)
- 下载 boost 1.67.0
- 在 VS 命令提示符中 运行 Bootstrap 和 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,是没有错误的。
将我的评论变成答案:
您缺少 link 您的可执行文件到 Boost 的 date_time
库。如您所见,包含一个不同的 header 可能会消除这种 link 依赖性。
大多数 Boost 库仅 header。但有些不是,需要将库添加到 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})
。如果您需要 link PUBLIC/PRIVATE/INTERFACE
取决于您的 library/DLL/shared object 是否公开了 Boost 库中的类型。