我正在开发一个使用 SAF(空间音频框架)的项目,该框架具有 OpenBlas 和 LAPACK 作为依赖项。 (该项目包含很多库,所以我只显示与我的问题相关的代码:BLAS)
我试图弄清楚如何将该项目与 OpenBlas 链接起来,但没有任何效果。 我使用 cmake 的 FETCHCONTENT 来获取 LAPACK,其中也包含 BLAS。 我试过:
target_link_libraries(dev_example PUBLIC openblas) # or libopenblas or cblas or libblas
导致
cannot find -lopenblas
。
现在我尝试直接指定库
SET(OPENBLAS_LIBRARY ${lapack_BINARY_DIR}/lib/libblas.a)
并获得很多未定义的引用,例如undefined reference to 'cblas_sgemm'
我还尝试从
OpenBlas Repo的预编译二进制文件链接到
libopenblas.a
- 与上面相同。
我的CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(dev_example VERSION 1.0 LANGUAGES C CXX)
include(FetchContent)
FETCHCONTENT_DECLARE(
lapack
GIT_REPOSITORY https://github.com/Reference-lapack/lapack
GIT_TAG master
)
FetchContent_MakeAvailable(lapack)
FetchContent_GetProperties(lapack)
if(NOT lapack_POPULATED)
FetchContent_Populate(lapack)
endif()
set(OPENBLAS_HEADER_PATH ${lapack_SOURCE_DIR}/CBLAS/include)
set(LAPACKE_HEADER_PATH ${lapack_SOURCE_DIR}/LAPACKE/include ${lapack_BINARY_DIR}/include)
SET(LAPACKE_LIBRARY ${lapack_BINARY_DIR}/lib/liblapack.a)
SET(OPENBLAS_LIBRARY ${lapack_BINARY_DIR}/lib/libblas.a)
add_executable(dev_example WIN32
main.cpp
)
target_include_directories(dev_example PUBLIC
${lapack_SOURCE_DIR}/CBLAS/include
${lapack_BINARY_DIR}/include
)
target_link_libraries(dev_example PUBLIC
${OPENBLAS_LIBRARY}
)
如何正确链接 Blas? 我确保
libblas.a
位于给定目录中。
我还想知道我是否使用了正确的 BLAS 库,因为所有未定义的引用都以
cblas_
为前缀,如 cblas_sgemm
,而 libblas.a
只包含像 sgemm
这样的符号,没有前缀。
编译器:
gcc.exe (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 8.1.0
我还尝试从 OpenBlas Repo 的预编译二进制文件链接 libopenblas.a - 与上面相同。
我错了。在
libopenblas.a
中添加 target_link_libraries
不起作用。然而使用
SET(OPENBLAS_LIBRARY ${dir_to_lib}/libopenblas.a)
链接OpenBLAS为我完成了这项工作。看起来 SAF 需要
OPENBLAS_LIBRARY
设置才能正常工作。 FetchContent
没有为 BLAS 设置任何库变量,取消链接 find_package
通常会。
我假设 Github 上的 LAPACK 包含 BLAS 的不同实现,而不是 OpenBLAS。