在 CMake 项目中使用 vendored OpenBLAS 作为依赖项

Using vendored OpenBLAS as a dependency in a CMake project

我已将 OpenBLAS 作为 thirdparty/OpenBLAS 中的 Git 子模块签出。有

add_subdirectory("${PROJECT_SOURCE_DIR}/thirdparty/OpenBLAS")

CMakeLists.txt 它成功配置和构建。但是

target_link_libraries(encoder_sample fused_transformer OpenBLAS::OpenBLAS OpenMP::OpenMP_CXX ${CMAKE_THREAD_LIBS_INIT})

找不到目标:

Target "encoder_sample" links to target "OpenBLAS::OpenBLAS" but the target
was not found.  Perhaps a find_package() call is missing for an IMPORTED
target, or an ALIAS target is missing?

如果重要的话,我正在使用 Visual Studio 2019 和 WSL。我希望我遗漏了一些微不足道的东西,只是想不通是什么...

因为您正在配置和构建 OpenBLAS 作为 CMake 项目的一部分,所以 IMPORTED 目标 OpenBLAS::OpenBLAS 不可用。导入的目标由 OpenBLASConfig.cmake 配置文件定义,通常与 find_package(OpenBLAS ...) 命令结合使用,在您的计算机上 安装 OpenBLAS 之后。在您的情况下,您可以直接使用 OpenBLAS CMake 目标 ,如其 CMake 文件所定义。

假设您的 OpenBLAS 存储库类似于 this GitHub repo, the CMake target is defined here:

set(OpenBLAS_LIBNAME openblas${SUFFIX64_UNDERSCORE})

...

add_library(${OpenBLAS_LIBNAME} ${LA_SOURCES} ${LAPACKE_SOURCES} ${RELA_SOURCES} ${TARGET_OBJS} ${OpenBLAS_DEF_FILE})

因此您要使用的目标名称将是 openblasopenblas_64,具体取决于您的目标体系结构。所以对于 64 位版本,你可以试试这个:

 target_link_libraries(encoder_sample fused_transformer openblas_64 OpenMP::OpenMP_CXX ${CMAKE_THREAD_LIBS_INIT})