链接到链接另一个库的库

时间:2018-02-27 08:54:57

标签: c++

当我创建一个链接到外部库(线性代数,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

0 个答案:

没有答案