我做了這樣一個小例子下:如何使用CholmodSupport在Eigen3 Ubuntu的
solver.h
#pragma once
#include <Eigen/Dense>
#include <Eigen/Sparse>
#include <Eigen/CholmodSupport>
typedef Eigen::SparseMatrix<double> SpMat;
class UseCholmodSolver
{
public:
UseCholmodSolver() {}
~UseCholmodSolver() {}
private:
Eigen::CholmodSupernodalLLT<SpMat> cholmod;
};
solver.cpp
#include "solver.h"
的main.cpp
#include "solver.h"
int main()
{
return 0;
}
Makefile
CXXFLAGS=-g -O2 -Wall -DNDEBUG -I./ext/eigen -I/usr/include/suitesparse
CXX=g++
all: t1
clean:
rm -f *.o main
main.o: main.cpp solver.h
solver.o: solver.cpp solver.h
t1: main.o
$(CXX) main.o -o main -lcholmod
t2: main.o solver.o
$(CXX) main.o solver.o -o main -lcholmod
當我執行「make t1」時,一切都很好。 然而,當我輸入「make T2」,有重定義錯誤:
g++ main.o solver.o -o main -lcholmod
solver.o: In function `int Eigen::internal::cm_start<long>(cholmod_common_struct&)':
/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:177: multiple definition of `int Eigen::internal::cm_start<long>(cholmod_common_struct&)'
main.o:/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:177: first defined here
solver.o: In function `int Eigen::internal::cm_finish<long>(cholmod_common_struct&)':
/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:178: multiple definition of `int Eigen::internal::cm_finish<long>(cholmod_common_struct&)'
main.o:/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:178: first defined here
solver.o: In function `int Eigen::internal::cm_free_factor<long>(cholmod_factor_struct*&, cholmod_common_struct&)':
/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:180: multiple definition of `int Eigen::internal::cm_free_factor<long>(cholmod_factor_struct*&, cholmod_common_struct&)'
main.o:/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:180: first defined here
solver.o: In function `int Eigen::internal::cm_free_dense<long>(cholmod_dense_struct*&, cholmod_common_struct&)':
/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:181: multiple definition of `int Eigen::internal::cm_free_dense<long>(cholmod_dense_struct*&, cholmod_common_struct&)'
main.o:/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:181: first defined here
solver.o: In function `int Eigen::internal::cm_free_sparse<long>(cholmod_sparse_struct*&, cholmod_common_struct&)':
/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:182: multiple definition of `int Eigen::internal::cm_free_sparse<long>(cholmod_sparse_struct*&, cholmod_common_struct&)'
main.o:/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:182: first defined here
solver.o: In function `cholmod_factor_struct* Eigen::internal::cm_analyze<long>(cholmod_sparse_struct&, cholmod_common_struct&)':
/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:184: multiple definition of `cholmod_factor_struct* Eigen::internal::cm_analyze<long>(cholmod_sparse_struct&, cholmod_common_struct&)'
main.o:/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:184: first defined here
solver.o: In function `cholmod_dense_struct* Eigen::internal::cm_solve<long>(int, cholmod_factor_struct&, cholmod_dense_struct&, cholmod_common_struct&)':
/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:187: multiple definition of `cholmod_dense_struct* Eigen::internal::cm_solve<long>(int, cholmod_factor_struct&, cholmod_dense_struct&, cholmod_common_struct&)'
main.o:/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:187: first defined here
solver.o: In function `cholmod_sparse_struct* Eigen::internal::cm_spsolve<long>(int, cholmod_factor_struct&, cholmod_sparse_struct&, cholmod_common_struct&)':
/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:190: multiple definition of `cholmod_sparse_struct* Eigen::internal::cm_spsolve<long>(int, cholmod_factor_struct&, cholmod_sparse_struct&, cholmod_common_struct&)'
main.o:/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:190: first defined here
solver.o: In function `int Eigen::internal::cm_factorize_p<long>(cholmod_sparse_struct*, double*, long*, unsigned long, cholmod_factor_struct*, cholmod_common_struct&)':
/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:195: multiple definition of `int Eigen::internal::cm_factorize_p<long>(cholmod_sparse_struct*, double*, long*, unsigned long, cholmod_factor_struct*, cholmod_common_struct&)'
main.o:/home/xiang/Code/testEigen/./ext/eigen/Eigen/src/CholmodSupport/CholmodSupport.h:195: first defined here
collect2: error: ld returned 1 exit status
Makefile:14: recipe for target 't2' failed
make: *** [t2] Error 1
看來原因是「長」型專業模板「CholmodSupport.h」功能。任何想法解決這個問題?
請提供[mcve](包括您用於編譯的命令)。 – chtz
@chtz我做了一個簡單的例子並編輯了問題。 – DeathKnight
感謝您的最小例子。這在Eigen中確實是一個問題。我會立即做出修復。 – chtz