如何通过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)
关键修改说明
- 禁用OpenBLAS安装:通过
set(NO_INSTALL ON)让OpenBLAS仅编译本地库,不执行系统安装步骤,完全符合需求。 - 使用CMake目标链接:替代直接写
openblas_64,改用OpenBLAS子目录导出的OpenBLAS目标,CMake会自动处理库的路径、头文件依赖及编译顺序,确保先编译OpenBLAS再编译你的项目。 - 现代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
相关产品推荐
相关产品推荐

