我正在尝试构建 Armadillo C++ 库(版本 6.6),它确实构建得很好。然而,我的问题是我已经单独下载了 OpenBLAS 的源代码并构建了它。我希望犰狳使用我在本地构建的 OpenBLAS,并且我希望它能够将其静态链接到生成的犰狳库中。
所以,
- 我如何告诉 Armadillo CMake 使用特定的 OpenBLAS?
- 我如何告诉犰狳 CMake 静态链接上面的 OpenBLAS,以便它生成一个包含我的 OpenBLAS 的 libarmadillo?
如果您从源代码安装了 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.
我希望这个建议有所帮助。
如果您是从源代码构建(如推荐的那样),请检查目录 cmake_aux。
此目录中的 ARMA_FindOpenBLAS.cmake 文件搜索 OpenBLAS 库。
修改搜索路径以指向所需的 OpenBLAS 库的位置对我有用。
对于静态链接,您必须修改 CMakeFiles/armadillo.dir 中的 build.make、depend.make 和 link.txt 文件
我知道这是一个非常不完整的解决方案。
如果有更好的解决方案,我想知道。