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

Visual Studio 10编译Boost Regex 1.47测试示例遇LNK1104链接错误

解决Boost Regex链接错误:LNK1104 无法打开libboost_regex-vc100-mt-1_47.lib

问题原因

你遇到的LNK1104错误确实和库文件名前缀有关:CMake默认会给链接的共享库自动添加lib前缀,但你通过link=shared参数编译的Boost共享库,文件名默认不带lib前缀(Boost编译共享库时的命名规则),导致CMake查找的文件名和实际存在的文件名不匹配。

解决方案

方案1:使用CMake的FindBoost模块(推荐)

手动指定Boost路径和库名容易出错,改用官方的FindBoost模块可以自动匹配库文件,避免前缀和版本号的问题。修改后的CMakeLists.txt如下:

cmake_minimum_required(VERSION 2.6)

project(test)

set(CMAKE_BUILD_TYPE Release)

# 指定Boost根目录
set(BOOST_ROOT "D:/test/boost_1_47_0")
# 声明使用共享库(对应你编译Boost时的link=shared)
set(Boost_USE_STATIC_LIBS OFF)
# 启用多线程库(对应Boost库名里的mt后缀)
set(Boost_USE_MULTITHREADED ON)

# 查找所需的Boost组件
find_package(Boost REQUIRED COMPONENTS regex)

# 添加Boost头文件路径
include_directories(${Boost_INCLUDE_DIRS})

set(testlib_src test.cpp)
add_library(testlib SHARED ${testlib_src})

# 链接Boost库(自动匹配正确的库文件名)
target_link_libraries(testlib ${Boost_LIBRARIES})

方案2:手动修正库文件名前缀

如果坚持手动指定库路径,可以通过修改CMake变量去掉默认的lib前缀,或者直接写全库文件名:

方法A:修改CMake共享库前缀变量

在CMakeLists.txt中添加以下配置,告诉CMake当前项目的共享库不带lib前缀:

# 去掉共享库的默认lib前缀
set(CMAKE_SHARED_LIBRARY_PREFIX "")

之后保持原有的target_link_libraries(testlib boost_regex-vc100-mt-1_47)即可。

方法B:直接指定完整库文件名

将target_link_libraries改为直接引用实际存在的库文件:

target_link_libraries(testlib "boost_regex-vc100-mt-1_47.lib")

额外注意事项

  1. 编译平台一致性:
    • 编译32位/64位版本时,需要确保Boost和你的项目编译平台一致:
      • 编译Boost 64位时,需要给b2命令添加address-model=64参数:
        .\b2 --build-type=complete variant=release link=shared runtime-link=shared address-model=64 stage
        
      • 编译项目64位版本时,需要先启动VS的64位命令行环境(比如运行VS10的vcvarsamd64.bat),再执行cmake和nmake命令。
  2. CMake生成器冲突:
    你的cmake命令中使用了两个-G参数,CMake只会生效最后一个(即NMake Makefiles),之前的Visual Studio 10会被忽略,这不会影响编译,但需要明确当前使用的是NMake生成器。

内容的提问来源于stack exchange,提问作者Rosssssss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 03:04:57