在VS2017+CMake中使用Boost.Asio TCP遇LNK1104错误求助
解决Boost.Asio TCP在VS2017+CMake项目中的LNK1104链接错误
这个错误的根源很清晰:当使用Boost.Asio的TCP模块时,它依赖Boost.Date_Time库,但你的CMake配置里虽然找到了这个组件,却没有把它链接到可执行文件中——而UDP模块不需要这个依赖,所以切换到UDP时就不会报错。另外还要排查编译架构和运行时库的匹配问题,下面是具体的解决方案:
1. 修正CMakeLists.txt,补充缺失的库链接
你的target_link_libraries只添加了Boost_SYSTEM_LIBRARY,漏掉了Boost_DATE_TIME_LIBRARY。最简单的方式是直接链接所有找到的Boost组件库,修改这一行:
# 替换原来的target_link_libraries行 target_link_libraries(${EXEC_NAME} ${Boost_LIBRARIES})
如果你想明确指定链接的库,也可以写成:
target_link_libraries(${EXEC_NAME} ${Boost_SYSTEM_LIBRARY} ${Boost_DATE_TIME_LIBRARY})
同时,建议在CMake里明确指定Boost的使用参数,避免自动匹配错误:
# 在find_package前添加这些配置 set(Boost_USE_MULTITHREADED ON) set(Boost_USE_STATIC_RUNTIME ON)
完整的修正后CMakeLists.txt示例:
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) set(Boost_USE_MULTITHREADED ON) set(Boost_USE_STATIC_RUNTIME ON) find_package(Boost "1.67.0" COMPONENTS ${BOOST_MANDATORY_COMPONENTS} REQUIRED) include_directories(${Boost_INCLUDE_DIRS}) target_link_libraries(${EXEC_NAME} ${Boost_LIBRARIES})
2. 确认Boost编译架构与项目目标架构匹配
错误中的库名是libboost_date_time-vc141-mt-gd-x32-1_67.lib,其中x32表示这是32位库。你需要:
- 检查VS项目的目标架构:在VS顶部工具栏确认是
x86(32位)还是x64(64位)。如果项目是64位,要么把项目改成32位,要么重新编译64位的Boost库(编译时执行b2 address-model=64)。 - 确保编译Boost时使用了对应架构的VS命令提示符:比如编译32位库要用
x86 Native Tools Command Prompt for VS 2017,编译64位用x64 Native Tools Command Prompt for VS 2017。
3. 验证Boost编译参数与项目运行时库匹配
库名里的mt-gd表示:
mt:多线程模式gd:调试版本+静态运行时库(对应VS的/MTd选项)
你需要确认项目的运行时库设置和这个匹配:
- 在VS中打开CMake项目的设置
- 找到
C/C++ -> 代码生成 -> 运行时库 - 调试模式下选择
多线程调试 (/MTd),发布模式选择多线程 (/MT)
如果你的项目需要用动态运行时库(/MDd//MD),那你需要重新编译Boost,指定runtime-link=shared参数,比如:
b2 --with-date_time --with-system address-model=32 runtime-link=shared
4. 检查Boost库文件是否存在
最后确认你的Boost安装目录下的lib文件夹里确实有libboost_date_time-vc141-mt-gd-x32-1_67.lib这个文件。如果没有,说明你编译Boost时没有包含date_time组件,重新编译时可以指定组件:
b2 --with-date_time --with-system address-model=32 runtime-link=static
内容的提问来源于stack exchange,提问作者Mahdi
相关产品推荐
相关产品推荐

