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

如何通过CMake链接本地OpenBLAS且无需安装?

问题

未安装OpenBLAS且不想安装,希望通过CMake使用本地副本构建项目。参考相关内容编写了CMakeLists.txt,但编译时出现链接错误,提示找不到-lopenblas_64。

原CMakeLists.txt

cmake_minimum_required(VERSION 3.24)
project(untitled)

set(CMAKE_CXX_STANDARD 20)

add_executable(Eigentest main.cpp)

include_directories(${CMAKE_SOURCE_DIR}/Libraries/eigen-3.4.0)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -O3 -fopenmp -march=native")

add_subdirectory("${CMAKE_SOURCE_DIR}/Libraries/OpenBLAS-0.3.21")

target_link_libraries(Eigentest openblas_64)

CMake配置输出

[...]
-- /home/user/Desktop/untitled/cmake-build-debug/Libraries/OpenBLAS-0.3.21/lapack/CMakeFiles/dtrti2_LU.c
-- /home/user/Desktop/untitled/cmake-build-debug/Libraries/OpenBLAS-0.3.21/lapack/CMakeFiles/ctrti2_LU.c
-- /home/user/Desktop/untitled/cmake-build-debug/Libraries/OpenBLAS-0.3.21/lapack/CMakeFiles/ztrti2_LU.c
-- c lapack
-- Building deprecated routines
-- Building Single Precision
-- Building Double Precision
-- Building Single Precision Complex
-- Building Double Precision Complex
-- Generating openblas_config.h in include/openblas
-- Generating cblas.h in include/openblas
-- Copying LAPACKE header files to include/openblas
-- Configuring done
-- Generating done
-- Build files have been written to: /home/user/Desktop/untitled/cmake-build-debug

编译错误

FAILED: Eigentest 
: && /usr/bin/c++ -fsanitize=address -O3 -fopenmp -march=native -g  CMakeFiles/Eigentest.dir/main.cpp.o -o Eigentest  -lopenblas_64 && :
/usr/bin/ld: cannot find -lopenblas_64: No such file or directory
collect2: error: ld returned 1 exit status

解决方案

问题根源是直接使用-lopenblas_64链接时,编译器找不到本地编译的OpenBLAS库路径,且未利用CMake子目录引入后的目标管理能力。以下是修正后的实现:

修改后的CMakeLists.txt

cmake_minimum_required(VERSION 3.24)
project(untitled)

set(CMAKE_CXX_STANDARD 20)

# 创建可执行目标
add_executable(Eigentest main.cpp)

# 配置Eigen头文件(改用target级别的设置,避免全局污染)
target_include_directories(Eigentest PRIVATE ${CMAKE_SOURCE_DIR}/Libraries/eigen-3.4.0)

# 设置编译选项(同样用target级别,仅作用于当前项目)
target_compile_options(Eigentest PRIVATE -fsanitize=address -O3 -fopenmp -march=native)

# 引入本地OpenBLAS,同时禁用安装步骤(符合不安装的需求)
set(NO_INSTALL ON CACHE BOOL "Skip OpenBLAS installation")
add_subdirectory("${CMAKE_SOURCE_DIR}/Libraries/OpenBLAS-0.3.21")

# 链接OpenBLAS的CMake目标(自动处理库路径、依赖等)
target_link_libraries(Eigentest PRIVATE OpenBLAS)

关键修改说明

  1. 禁用OpenBLAS安装:通过set(NO_INSTALL ON)让OpenBLAS仅编译本地库,不执行系统安装步骤,完全符合需求。
  2. 使用CMake目标链接:替代直接写openblas_64,改用OpenBLAS子目录导出的OpenBLAS目标,CMake会自动处理库的路径、头文件依赖及编译顺序,确保先编译OpenBLAS再编译你的项目。
  3. 现代CMake用法:用target_include_directories和target_compile_options替代全局的include_directories和CMAKE_CXX_FLAGS,避免污染其他目标的配置。

兼容旧版OpenBLAS的备选方案

如果你的OpenBLAS版本较旧,未导出OpenBLAS目标,可改用其提供的变量:

# 添加子目录后,OpenBLAS会自动设置以下变量
target_include_directories(Eigentest PRIVATE ${OPENBLAS_INCLUDE_DIR})
target_link_directories(Eigentest PRIVATE ${OPENBLAS_LIB_DIR})
target_link_libraries(Eigentest PRIVATE ${OPENBLAS_LIBRARIES})

内容的提问来源于stack exchange,提问作者noobquestionsonly

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:50:14