如何在非标准位置构建 Armadillo C++ lib 以静态链接到 OpenBLAS

Posted

技术标签:

【中文标题】如何在非标准位置构建 Armadillo C++ lib 以静态链接到 OpenBLAS【英文标题】:How to build Armadillo C++ lib to statically link to OpenBLAS in non-standard location 【发布时间】:2016-03-28 16:13:52 【问题描述】:

我正在尝试构建 Armadillo C++ 库(6.6 版),它确实构建得很好。然而,我的问题是我已经单独下载了 OpenBLAS 的源代码并构建了它。我希望犰狳使用我在本地构建的 OpenBLAS,并且我希望它能够将其静态链接到生成的犰狳库中。

所以,

    如何让 Armadillo CMake 使用特定的 OpenBLAS? 如何告诉 Armadillo CMake 静态链接上述 OpenBLAS,以便生成包含我的 OpenBLAS 的 libarmadillo?

【问题讨论】:

【参考方案1】:

如果您从源代码安装了 OpenBLAS,它位于非标准位置(对我而言,它位于 /opt/OpenBLAS)并且具有非标准名称 (OpenBLAS)。因此cmake很难找到它,以解决问题 请编辑 your_sources_dir/cmake_aux/Modules/ARMA_FindOpenBLAS.cmake 中的文件,如下所示:

set(OpenBLAS_NAMES)
set(OpenBLAS_NAMES $OpenBLAS_NAMES openblaso)
set(OpenBLAS_NAMES $OpenBLAS_NAMES openblasp)
set(OpenBLAS_NAMES $OpenBLAS_NAMES openblas )
set(OpenBLAS_NAMES $OpenBLAS_NAMES OpenBLAS )

set(OpenBLAS_TMP_LIBRARY)
set(OpenBLAS_TMP_LIBRARIES)


foreach (OpenBLAS_NAME $OpenBLAS_NAMES)
  find_library($OpenBLAS_NAME_LIBRARY
    NAMES $OpenBLAS_NAME
    PATHS $CMAKE_SYSTEM_LIBRARY_PATH /lib64 /lib /usr/lib64 /usr/lib /usr/local/lib64 /usr/local/lib /opt/local/lib64 /opt/local/lib /opt/OpenBLAS/lib
    )

  set(OpenBLAS_TMP_LIBRARY $$OpenBLAS_NAME_LIBRARY)

  if(OpenBLAS_TMP_LIBRARY)
    set(OpenBLAS_TMP_LIBRARIES $OpenBLAS_TMP_LIBRARIES $OpenBLAS_TMP_LIBRARY)
  endif()
endforeach()


# use only one library                                                                                                                                                                                                                       

if(OpenBLAS_TMP_LIBRARIES)
  list(GET OpenBLAS_TMP_LIBRARIES 0 OpenBLAS_LIBRARY)
endif()


if(OpenBLAS_LIBRARY)
  set(OpenBLAS_LIBRARIES $OpenBLAS_LIBRARY)
  set(OpenBLAS_FOUND "YES")
else()
  set(OpenBLAS_FOUND "NO")
endif()


if(OpenBLAS_FOUND)
  if (NOT OpenBLAS_FIND_QUIETLY)
    message(STATUS "Found OpenBLAS: $OpenBLAS_LIBRARIES")
  endif()
else()
  if(OpenBLAS_FIND_REQUIRED)
    message(FATAL_ERROR "Could not find OpenBLAS")
  endif()
endif()


# mark_as_advanced(OpenBLAS_LIBRARY)

然后使用cmake.继续定期安装犰狳

我希望这个建议会有所帮助。

【讨论】:

【参考方案2】:

如果您是从源代码构建(按照建议),请检查目录 cmake_aux。

此目录中的 ARMA_FindOpenBLAS.cmake 文件搜索 OpenBLAS 库。

修改搜索路径以指向所需的 OpenBLAS 库的位置对我有用。

对于静态链接,你必须修改 CMakeFiles/armadillo.dir 中的 build.make、depend.make 和 link.txt 文件

我知道这是一个非常不完整的解决方案。

如果有更好的解决方案,我想知道。

【讨论】:

以上是关于如何在非标准位置构建 Armadillo C++ lib 以静态链接到 OpenBLAS的主要内容,如果未能解决你的问题,请参考以下文章

在非标准位置构建具有 SSL 支持的 Python

Windows Visual Studio 2015、C++11 标准和 Armadillo 库

XCode 4、Armadillo 和 XCode 标准库

armadillo C++ 矩阵库——如何启用 ATLAS 或 LAPACK?

构建 TensorFlow:bazel 在非标准目录中找不到 libstdc++

在 Microsoft Visual Studio 2015 的 C++ 项目中包含 Armadillo C++ 库