当我创建一个链接到外部库(线性代数,MUMPS)的库时,我遇到了麻烦。如果我只是编写一个由Main.cpp和一个模块SOLVER.h和SOLVER.cpp组成的程序,我链接库MUMPS一切运行正常。 但是,如果我首先创建SOLVER库,然后编译相同的Main.cpp尝试链接SOLVER和MUMPS库,我收到一个错误。下面是一个例子: Main.cpp文件
#include "SOLVER.h"
int main(void) {
Eigen::VectorXd A; Eigen::VectorXd b;
A.resize(2); b.resize(2);
b << 1,2 ; A << 3.0 , 4.0 ;
SOLVER Solver;
Solver.SolveLinSyst(A, b);
return 0;
}
这里是搜索到的图书馆标题
#include <Eigen/Dense>
#include "dmumps_c.h"
#include <vector>
class SOLVER
{
public:
std::vector<int> ROW_ , COL_ ;
DMUMPS_STRUC_C mumps_par; // mumps structure
void SolveLinSyst(Eigen::VectorXd &a, Eigen::VectorXd &inout);
protected:
void AllocateInitializeVectors();
void NewtonStep();
};
在SOLVER.cpp中,我有一个MUMPS结构实例化dmumps_c(&amp; mumps_par)。
当我直接编译Main和SOLVER模块时,一切正常。 但是,当我第一次将SOLVER编译为库时,然后,单独地,我尝试编译Main链接它与生成的libSolver.a库我收到一条错误消息。 这是我用来创建库的makefile,或直接编译Main和SOLVER.cpp。
CFLAGS=-c -std=c++14 -Wfatal-errors -lm -O0 -g -Wall -Wunused-parameter -fwhole-file -pedantic -Wextra
LIBS = -ldmumps -lmumps_common -lmpiseq -lopenblas -lgfortran -lquadmath -lpthread
all: Main_
library: SOLVER.o
ar r libSolver.a SOLVER.o
ranlib libSolver.a
Main_: SOLVER.o Main.o
g++ -static $(INCLUDES) SOLVER.o Main.o -o Main.exe $(LIBS_PATH) $(LIBS) -Wl,-rpath=$(LIBS_PATH)
Main_.o: Main_.cpp
g++ $(CFLAGS) $(INCLUDES) Main_.cpp
SOLVER.o: SOLVER.cpp
g++ $(CFLAGS) $(INCLUDES) $(LIBS_PATH) $(LIBS) SOLVER.cpp
如果我单独创建库,我将Main_.cpp复制到子文件夹中的Main_testlib.cpp中,我添加了SOLVER.h的包含路径,即上面生成的libSolver.a库的路径
INCLUDES2 = $(INCLUDES) -I../
LIBS2 = $(LIBS) -lSolver
LIBS_PATH2 = $(LIBS_PATH) -L../
all: Main_testlib
Main_testlib: Main_testlib.o
g++ Main_testlib.o -o Main_testlib.exe $(LIBS_PATH2) $(LIBS2) -Wl,-rpath=$(LIBS_PATH2)
Main_testlib.o: Main_testlib.cpp
g++ $(CFLAGS) $(INCLUDES) Main_testlib.cpp
我在链接阶段发现错误:
> ..//libSolver.a(SOLVER.o): In function `SOLVER::SolveLinSyst(Eigen::Matrix<double, -1, 1, 0, -1, 1>&,
> Eigen::Matrix<double, -1, 1, 0, -1, 1>&)':
> C:\test/SOLVER.cpp:18: undefined reference to `dmumps_c'
> ..//libSolver.a(SOLVER.o): In function `SOLVER::AllocateInitializeVectors()':
> C:\test/SOLVER.cpp:34: undefined reference to `dmumps_c'
> collect2.exe: error: ld returned 1 exit status