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")
额外注意事项
- 编译平台一致性:
- 编译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命令。
- 编译Boost 64位时,需要给
- 编译32位/64位版本时,需要确保Boost和你的项目编译平台一致:
- CMake生成器冲突:
你的cmake命令中使用了两个-G参数,CMake只会生效最后一个(即NMake Makefiles),之前的Visual Studio 10会被忽略,这不会影响编译,但需要明确当前使用的是NMake生成器。
内容的提问来源于stack exchange,提问作者Rosssssss
相关产品推荐
相关产品推荐

