CMake中FindLAPACK.cmake未设置LAPACK_INCLUDE_DIRS的编译问题解决
解决CMake链接Conda环境下LAPACK并找到lapacke.h的问题
以下是针对你的场景的具体解决步骤:
1. 让CMake优先搜索Conda环境路径
由于CMake和LAPACK都在Conda的非标准路径下,首先要引导CMake优先查找Conda环境内的资源。执行CMake配置时,通过CMAKE_PREFIX_PATH指定Conda环境根目录:
cmake .. -DCMAKE_PREFIX_PATH=$CONDA_PREFIX
这会避免CMake默认搜索系统路径,优先检索Conda环境中的库和头文件。
2. 手动定位LAPACKE头文件并关联目标
如果find_package(LAPACK)未自动设置头文件路径,可直接用find_path定位lapacke.h,再将路径添加到你的目标库:
# 优先在Conda环境中查找lapacke.h find_path(LAPACKE_INCLUDE_DIR NAMES lapacke.h PATHS ${CONDA_PREFIX}/include NO_DEFAULT_PATH REQUIRED) # 将头文件路径关联到你的目标库 target_include_directories(mylibrary PUBLIC ${LAPACKE_INCLUDE_DIR}) # 保持原有的库链接逻辑 target_link_libraries(mylibrary PUBLIC LAPACK::LAPACK)
3. 补全LAPACK目标的接口包含路径(更规范的方式)
如果你希望通过LAPACK::LAPACK目标自动传递头文件路径,可以手动补全该目标的接口属性:
find_package(LAPACK REQUIRED) # 检查LAPACK目标是否已包含头文件路径 get_target_property(LAPACK_HAS_INCLUDES LAPACK::LAPACK INTERFACE_INCLUDE_DIRECTORIES) if(NOT LAPACK_HAS_INCLUDES) # 查找lapacke.h路径 find_path(LAPACKE_INCLUDE_DIR lapacke.h PATHS ${CONDA_PREFIX}/include REQUIRED) # 将路径添加到LAPACK目标的接口属性,后续链接时自动传递 target_include_directories(LAPACK::LAPACK INTERFACE ${LAPACKE_INCLUDE_DIR}) endif() # 正常链接即可,头文件路径会随目标自动传递 target_link_libraries(mylibrary PUBLIC LAPACK::LAPACK)
4. 确认Conda环境安装了LAPACKE组件
部分Conda的LAPACK包可能不包含C接口的LAPACKE,需要单独安装对应包:
conda install -c conda-forge lapacke
内容的提问来源于stack exchange,提问作者Dmitry Kabanov
相关产品推荐
相关产品推荐

