You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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选项)

你需要确认项目的运行时库设置和这个匹配:

  1. 在VS中打开CMake项目的设置
  2. 找到C/C++ -> 代码生成 -> 运行时库
  3. 调试模式下选择多线程调试 (/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:04:13