linker — Как собрать библиотеку Armadillo C ++ для статической ссылки на OpenBLAS в нестандартном месте

Я пытаюсь собрать библиотеку Armadillo C ++ (версия 6.6), и она работает нормально. Моя проблема, однако, в том, что я отдельно скачал исходный код для OpenBLAS и собрал его. Я хочу, чтобы Armadillo использовал OpenBLAS, который я создал локально, и мне бы хотелось, чтобы он статически связывал его с создаваемой библиотекой Armadillo.

Так,

  1. Как я могу сказать, что Armadillo CMake должен использовать определенный OpenBLAS?
  2. Как я могу сказать Armadillo CMake статически связать вышеупомянутый OpenBLAS, чтобы он создавал libarmadillo, в котором содержится мой OpenBLAS?

0

Решение

Если вы установили 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

Другие решения

Если вы строите из исходного кода (как рекомендуется), проверьте каталог cmake_aux.

Файл ARMA_FindOpenBLAS.cmake в этом каталоге выполняет поиск библиотеки OpenBLAS.

Изменение путей поиска, указывающих на местоположение библиотеки OpenBLAS, помогло мне.

Для статической компоновки необходимо изменить файлы build.make, зависимость.make и link.txt в CMakeFiles / armadillo.dir

Я знаю, что это очень неоднозначное решение.

Если есть лучшее решение, я хотел бы знать.

0

По вопросам рекламы [email protected]