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

问题描述 投票:0回答:2

对于一个项目,我需要使用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

如何让它发挥作用?
谢谢

c++ armadillo
2个回答
1
投票

我对这里的犰狳不熟悉,但你可能需要在#include之前#define


0
投票

编译器抱怨它没有找到犰狳的 SuperLU 包装器使用的 SuperLU 或 CBLAS 中的符号。

安装 Superlu 或通过将

-D ARMA_USE_SUPERLU=ON
传递给您的 cmake 调用来与 Armadillo 一起构建它会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.