Arch Linux下CMake项目Quadmath与boost::multiprecision头文件找不到问题
问题:CMake项目中Boost无法找到quadmath.h
在Arch Linux + GCC环境下开发CMake项目,已安装Boost和Quadmath,但代码中包含<boost/multiprecision/float128.hpp>时提示'quadmath.h'未找到,该文件实际存在于/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/include路径下。
现有配置展示
自定义FindQuadmath.cmake
include(FindPackageHandleStandardArgs) include_directories("/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/include") find_path(Quadmath_INCLUDE_DIR NAMES quadmath.h PATHS "/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/include") find_library(Quadmath_LIBRARY NAMES quadmath) message("Quadmath_INCLUDE_DIR: ${Quadmath_INCLUDE_DIR}") message("Quadmath_LIBRARY: ${Quadmath_LIBRARY}") add_library(Quadmath SHARED IMPORTED ${Quadmath_LIBRARY}) target_include_directories(Quadmath INTERFACE ${Quadmath_INCLUDE_DIR}) set_property(TARGET Quadmath PROPERTY IMPORTED_LOCATION ${Quadmath_LIBRARY}) set_property(TARGET Quadmath PROPERTY INCLUDE_DIRECTORIES ${Quadmath_INCLUDE_DIR}) find_package_handle_standard_args(Quadmath DEFAULT_MSG Quadmath_LIBRARY Quadmath_INCLUDE_DIR)
项目结构
├── cmake │ └── FindQuadmath.cmake ├── CMakeLists.txt ├── conanfile.txt ├── conan_profiles │ └── phd ├── README.md ├── requirements.txt ├── solvers │ ├── CMakeLists.txt │ └── heat_transfer_explicit_scheme │ ├── CMakeLists.txt │ ├── include │ │ └── heat_transfer_explicit_scheme.hpp │ └── src │ └── heat_transfer_explicit_scheme.cpp └── tests
顶层CMakeLists.txt
cmake_minimum_required(VERSION 3.30) project(phd_project CXX) include(cmake/FindQuadmath.cmake) find_package(Boost REQUIRED) add_subdirectory(solvers/)
修复方案
1. 修正FindQuadmath.cmake的核心问题
原自定义模块存在语法错误和全局路径污染问题,修改为如下版本(自动适配GCC版本,避免硬编码路径):
include(FindPackageHandleStandardArgs) # 通过编译器自动获取quadmath.h的路径,适配不同GCC版本 execute_process( COMMAND ${CMAKE_CXX_COMPILER} -print-file-name=quadmath.h OUTPUT_VARIABLE Quadmath_H_PATH OUTPUT_STRIP_TRAILING_WHITESPACE ) get_filename_component(Quadmath_INCLUDE_DIR ${Quadmath_H_PATH} DIRECTORY) find_library(Quadmath_LIBRARY NAMES quadmath) message("Quadmath_INCLUDE_DIR: ${Quadmath_INCLUDE_DIR}") message("Quadmath_LIBRARY: ${Quadmath_LIBRARY}") # 创建标准导入目标,遵循CMake命名规范 add_library(Quadmath::Quadmath SHARED IMPORTED) set_target_properties(Quadmath::Quadmath PROPERTIES IMPORTED_LOCATION "${Quadmath_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${Quadmath_INCLUDE_DIR}" INTERFACE_LINK_LIBRARIES "${Quadmath_LIBRARY}" ) find_package_handle_standard_args(Quadmath DEFAULT_MSG Quadmath_LIBRARY Quadmath_INCLUDE_DIR ) mark_as_advanced(Quadmath_INCLUDE_DIR Quadmath_LIBRARY)
2. 调整顶层CMakeLists.txt,传递依赖给Boost
Boost需要明确获取quadmath的包含路径,通过统一的依赖目标传递给所有子模块:
cmake_minimum_required(VERSION 3.30) project(phd_project CXX) # 让CMake能找到自定义Find模块 set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) find_package(Quadmath REQUIRED) find_package(Boost REQUIRED) # 创建全局依赖目标,统一管理公共依赖 add_library(project_deps INTERFACE) target_link_libraries(project_deps INTERFACE Quadmath::Quadmath Boost::boost ) add_subdirectory(solvers/)
3. 在子模块中链接公共依赖
修改solvers/heat_transfer_explicit_scheme/CMakeLists.txt,确保目标能访问到quadmath和Boost的依赖:
add_library(heat_transfer_explicit_scheme src/heat_transfer_explicit_scheme.cpp ) target_include_directories(heat_transfer_explicit_scheme PUBLIC include ) target_link_libraries(heat_transfer_explicit_scheme PUBLIC project_deps )
4. 额外注意事项
- 无需手动添加
-lquadmath编译选项,导入目标已自动处理链接逻辑 - 若使用Conan,需确保Conan配置不会覆盖编译器的路径设置,可在profile中添加quadmath相关依赖声明
- 避免硬编码GCC版本号,使用编译器自动检测路径的方式可适配系统升级后的GCC版本
内容的提问来源于stack exchange,提问作者Alexander Kolbeko
相关产品推荐
相关产品推荐

