Windows下用CMake链接TDM MinGW编译的Boost 1.79库失败求助
错误信息
CMake Error at D:/CMake/share/cmake-3.24/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
Could NOT find Boost (missing: log thread) (found suitable version
"1.79.0", minimum required is "1.79")
Call Stack (most recent call first):
D:/CMake/share/cmake-3.24/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
D:/CMake/share/cmake-3.24/Modules/FindBoost.cmake:2376 (find_package_handle_standard_args)
CMakeLists.txt:16 (find_package)
问题分析
CMake能识别Boost版本,但找不到指定的静态库组件,大概率是CMake语法错误、库路径未正确指定或库命名匹配问题。
解决方案
1. 修复CMakeLists.txt的语法错误
你的set(Boost_DEBUG=ON)写法错误,CMake的set命令不需要等号,正确写法:
set(Boost_DEBUG ON)
开启调试模式后,CMake会输出详细的库搜索日志,能直接看到它搜索的路径、匹配的文件名,方便定位问题。
2. 手动指定Boost安装路径
CMake可能无法自动识别MinGW编译的Boost位置,显式指定路径:
# 替换成你的Boost实际安装路径 set(Boost_ROOT "D:/boost_1_79_0/install") set(Boost_INCLUDE_DIR "${Boost_ROOT}/include") set(Boost_LIBRARY_DIR "${Boost_ROOT}/lib")
3. 确保Boost.Log的依赖组件被包含
Boost.Log依赖thread、date_time、filesystem、system等组件,显式指定这些组件避免遗漏:
find_package(Boost 1.79 COMPONENTS log thread date_time filesystem system REQUIRED)
4. 使用CMake现代链接方式
替换旧的INCLUDE_DIRECTORIES和LINK_DIRECTORIES,改用target级别的设置,更可靠:
# 替换原有的include_directories和link_directories add_executable(testlib src/main.cpp) target_include_directories(testlib PRIVATE ${Boost_INCLUDE_DIRS}) target_link_libraries(testlib PRIVATE ${Boost_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
5. 检查Boost库的编译匹配性
- 确认编译Boost时的toolset和CMake使用的TDM MinGW版本一致:如果TDM MinGW是GCC 9.3,编译时应指定
toolset=gcc-9.3而非泛用的gcc,避免库命名不匹配。 - 检查Boost安装目录的
lib文件夹,确认存在类似libboost_log-mgw93-mt-d-x64-1_79.a、libboost_thread-mgw93-mt-d-x64-1_79.a的静态库文件。
修正后的完整CMakeLists.txt示例
cmake_minimum_required(VERSION 3.24) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 开启Boost调试日志 set(Boost_DEBUG ON) set(Boost_USE_STATIC_LIBS ON) set(Boost_USE_MULTITHREADED ON) set(Boost_USE_STATIC_RUNTIME OFF) # 指定Boost安装路径 set(Boost_ROOT "D:/boost_1_79_0/install") set(Boost_INCLUDE_DIR "${Boost_ROOT}/include") set(Boost_LIBRARY_DIR "${Boost_ROOT}/lib") project(testlib) find_package(Boost 1.79 COMPONENTS log thread date_time filesystem system REQUIRED) if(Boost_FOUND) message("Boost information") message("Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}") message("Boost_LIBRARY_DIRS: ${Boost_LIBRARY_DIRS}") message("Boost_Version: ${Boost_VERSION}") message("Boost Libraries: ${Boost_LIBRARIES}") endif() add_executable(testlib src/main.cpp) target_include_directories(testlib PRIVATE ${Boost_INCLUDE_DIRS}) target_link_libraries(testlib PRIVATE ${Boost_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
内容的提问来源于stack exchange,提问作者alexsey bobrovitch

