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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:29:51