首页 > 解决方案 > -larmadillo 和 -lopenblas -llapack 编译犰狳的区别

问题描述

对于下面的代码: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;
}

标签: c++compilationarmadillo

解决方案


-I ~/armadillo-openblas/include/ -L ~/armadillo-openblas/lib/如果您卸下零件,第一种情况应该可以工作。仅使用-larmadillo. Armadillo 可能是使用“香草”BLAS 和 Lapack 构建的,当您指定 openBlas 库时,它会被混淆。如果你想使用其他库,你必须使用-DARMA_DONT_USE_WRAPPER并指定依赖项,就像你展示的那样。

-O2标志是编译器的优化级别,有许多级别,从无-O0优化到-O3其他一些,例如-Ofast


推荐阅读