Разница в сборнике броненосцев между -larmadillo и -lopenblas -llapack - PullRequest
0 голосов
/ 28 июня 2019

Для кода ниже: test.cpp

когда я компилирую с

g++ -std=c++11 -I ~/armadillo-openblas/include/ -L ~/armadillo-openblas/lib/ test.cpp  -o test  -O2 -larmadillo

Я получил ошибку:

. / Test: ошибка при загрузке общих библиотек: libarmadillo.so.9: невозможно открыть общий объектный файл: нет такого файла или каталога

Но я уверен, что libarmadillo.so.9 находится в ~ / armadillo-openblas / lib /.

Я тоже пробовал с этим:

g++ -std=c++11 -I ~/armadillo-openblas/include/ -L ~/armadillo-openblas/lib/ test.cpp -o test -DARMA_DONT_USE_WRAPPER  -lopenblas -llapack

Это работает. Я знаю, что при добавлении ARMA_DONT_USE_WRAPPER мы можем скомпилировать его таким образом. но как не работает -larmadillo, если без ARMA_DONT_USE_WRAPPER?

Кстати, что значит -O2?

//test.cpp    
#include <iostream>
#include <armadillo>

int main(){
  arma::arma_rng::set_seed_random();
  arma::Mat<double> A = arma::randu(4,4);
  std::cout << A << std::endl;
  return -1;
}

1 Ответ

0 голосов
/ 29 июня 2019

Первый случай должен работать, если вы удалите часть -I ~/armadillo-openblas/include/ -L ~/armadillo-openblas/lib/.Достаточно использовать только -larmadillo.Armadillo, вероятно, построен с использованием «ванильных» BLAS и Lapack, и когда вы укажете библиотеку openBlas, она будет сбита с толку.Если вы хотите использовать другие библиотеки, вы должны использовать -DARMA_DONT_USE_WRAPPER и указать зависимости, как вы показали.

Флаг -O2 - это уровень оптимизации для компилятора, существует несколько уровнейот -O0 без оптимизации до -O3, а также некоторых других, например -Ofast

...