我试图在使用CMake的Visual Studio 2017中的一个简单项目中包含和使用boost ASIO TCP,但是当我运行项目时收到此错误:
LNK1104: cannot open file 'libboost_date_time-vc141-mt-gd-x32-1_67.lib'
这些是准备项目的步骤:
然后这是我的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,则没有错误。
答案 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库中的类型。