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

时间:2016-03-28 16:13:52

标签: c++ linker armadillo openblas

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

所以,

  1. 我如何告诉Armadillo CMake使用特定的OpenBLAS?
  2. 我如何告诉Armadillo CMake静态链接上面的OpenBLAS,以便它生成一个包含我的OpenBLAS的libarmadillo?

2 个答案:

答案 0 :(得分: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.

继续定期安装犰狳

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

答案 1 :(得分:0)

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

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

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

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

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

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