Armadillo和superLU错误:“必须启用SuperLU的使用”和未定义的引用

时间:2018-04-03 08:48:09

标签: c++ armadillo

对于一个项目,我需要使用armadillo给出的稀疏求解器,它似乎是SuperLU的包装器,我目前遇到了一个问题。
您可能还会注意到我无法访问计算机上的根目录 这是一个最小的例子:

#include <iostream>
#define ARMA_USE_SUPERLU 1
#include <armadillo>

using namespace arma;

int main()
{
  sp_mat A = sprandu<sp_mat>(1000, 1000, 0.1);
  vec b = randu<vec>(1000);
  vec x;
  spsolve(x, A, b, "superlu");  // use SuperLU solver
  return 0;
}

我的CMakeLists.txt是

cmake_minimum_required (VERSION 3.2)
project (test_super_LU)

set(base_flags "-g -O3 -std=c++11")
set(CMAKE_CXX_FLAGS ${base_flags})

set(CMAKE_C_COMPILER "gcc")
set(CMAKE_CXX_COMPILER "g++")

set(ARMADILLO_LIBRARIES "/home/cpivot/SoftWare/usr/lib64/libarmadillo.so")
set(SUPERLU_LIBRARIES "/home/cpivot/SoftWare/usr/lib64/libsuperlu.a")

include_directories(/home/cpivot/SoftWare/usr/include)
add_executable(test_superLU test_superLU.cpp)
target_link_libraries(test_superLU -g
-fPIC
${ARMADILLO_LIBRARIES}
${SUPERLU_LIBRARIES}
)

汇编给了我

[100%] Building CXX object CMakeFiles/test_superLU.dir/test_superLU.cpp.o
Linking CXX executable ../bin/test_superLU
CMakeFiles/test_superLU.dir/test_superLU.cpp.o: dans la fonction « arma::sp_auxlib::destroy_supermatrix(arma::superlu::SuperMatrix&) »:
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:166: référence indéfinie vers « wrapper_superlu_free »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:139: référence indéfinie vers « wrapper_Destroy_CompCol_Matrix »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:130: référence indéfinie vers « wrapper_Destroy_SuperNode_Matrix »
CMakeFiles/test_superLU.dir/test_superLU.cpp.o: dans la fonction « bool arma::sp_auxlib::spsolve_simple<arma::SpMat<double>, arma::Mat<double> >(arma::Mat<arma::SpMat<double>::elem_type>&, arma::SpBase<arma::SpMat<double>::elem_type, arma::SpMat<double> > const&, arma::Base<arma::SpMat<double>::elem_type, arma::Mat<double> > const&, arma::superlu_opts const&) »:
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:121: référence indéfinie vers « wrapper_set_default_options »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:157: référence indéfinie vers « wrapper_superlu_malloc »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:157: référence indéfinie vers « wrapper_superlu_malloc »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:157: référence indéfinie vers « wrapper_superlu_malloc »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:157: référence indéfinie vers « wrapper_superlu_malloc »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:157: référence indéfinie vers « wrapper_superlu_malloc »
CMakeFiles/test_superLU.dir/test_superLU.cpp.o:/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:157: encore plus de références indéfinies suivent vers « wrapper_superlu_malloc »
CMakeFiles/test_superLU.dir/test_superLU.cpp.o: dans la fonction « bool arma::sp_auxlib::spsolve_simple<arma::SpMat<double>, arma::Mat<double> >(arma::Mat<arma::SpMat<double>::elem_type>&, arma::SpBase<arma::SpMat<double>::elem_type, arma::SpMat<double> > const&, arma::Base<arma::SpMat<double>::elem_type, arma::Mat<double> > const&, arma::superlu_opts const&) »:
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:104: référence indéfinie vers « wrapper_StatInit »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:38: référence indéfinie vers « wrapper_dgssv »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:112: référence indéfinie vers « wrapper_StatFree »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:166: référence indéfinie vers « wrapper_superlu_free »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:166: référence indéfinie vers « wrapper_superlu_free »
CMakeFiles/test_superLU.dir/test_superLU.cpp.o: dans la fonction « bool arma::sp_auxlib::spsolve_refine<arma::SpMat<double>, arma::Mat<double> >(arma::Mat<arma::SpMat<double>::elem_type>&, arma::SpMat<double>::pod_type&, arma::SpBase<arma::SpMat<double>::elem_type, arma::SpMat<double> > const&, arma::Base<arma::SpMat<double>::elem_type, arma::Mat<double> > const&, arma::superlu_opts const&) »:
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:121: référence indéfinie vers « wrapper_set_default_options »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:157: référence indéfinie vers « wrapper_superlu_malloc »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:157: référence indéfinie vers « wrapper_superlu_malloc »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:157: référence indéfinie vers « wrapper_superlu_malloc »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:157: référence indéfinie vers « wrapper_superlu_malloc »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:157: référence indéfinie vers « wrapper_superlu_malloc »
CMakeFiles/test_superLU.dir/test_superLU.cpp.o:/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:157: encore plus de références indéfinies suivent vers « wrapper_superlu_malloc »
CMakeFiles/test_superLU.dir/test_superLU.cpp.o: dans la fonction « bool arma::sp_auxlib::spsolve_refine<arma::SpMat<double>, arma::Mat<double> >(arma::Mat<arma::SpMat<double>::elem_type>&, arma::SpMat<double>::pod_type&, arma::SpBase<arma::SpMat<double>::elem_type, arma::SpMat<double> > const&, arma::Base<arma::SpMat<double>::elem_type, arma::Mat<double> > const&, arma::superlu_opts const&) »:
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:104: référence indéfinie vers « wrapper_StatInit »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:82: référence indéfinie vers « wrapper_dgssvx »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:112: référence indéfinie vers « wrapper_StatFree »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:166: référence indéfinie vers « wrapper_superlu_free »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:166: référence indéfinie vers « wrapper_superlu_free »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:166: référence indéfinie vers « wrapper_superlu_free »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:166: référence indéfinie vers « wrapper_superlu_free »
/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:166: référence indéfinie vers « wrapper_superlu_free »
CMakeFiles/test_superLU.dir/test_superLU.cpp.o:/home/cpivot/SoftWare/usr/include/armadillo_bits/wrapper_superlu.hpp:166: encore plus de références indéfinies suivent vers « wrapper_superlu_free »
collect2: erreur: ld a retourné 1 code d'état d'exécution
make[2]: *** [../bin/test_superLU] Erreur 1
make[1]: *** [CMakeFiles/test_superLU.dir/all] Erreur 2
make: *** [all] Erreur 2

我怎样才能使它有效?
感谢

1 个答案:

答案 0 :(得分:1)

我不熟悉armadilo,但你可能需要在#include之前#define