【发布时间】: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'
这些是准备项目的步骤:
- 将 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,就没有错误了。
【问题讨论】:
-
它正在尝试链接到
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