在 Windows 上使用 cmake 未定义对 cblas_* 的引用

问题描述 投票:0回答:1

我正在开发一个使用 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

windows cmake linker blas openblas
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。

© www.soinside.com 2019 - 2024. All rights reserved.