链接在与另一个链接的库中链接

Linking against a library that links against another one

本文关键字:链接 另一个      更新时间:2023-10-16

当我创建一个链接到外部库(线性代数,mumps(的库时,我会遇到麻烦。如果我简单地编写一个由main.cpp和模块solver.h and solver.cpp组成的程序,然后将库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 i内部有一个实例化腮腺炎结构dmumps_c(&amp; mumps_par(。

当我直接编译主和求解器模块时,所有这些都可以正常工作。但是,当我第一次将求解器编译为库时,然后,分别尝试将主链接到生成的libsolver.a库时,我会收到一个错误消息。这是我用来创建库或直接编译主和solver.cpp的makefile。

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的inclage path。

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

i ge链接阶段的错误:

>     ..//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

我相信您需要在链接二进制文件时指定库的所有依赖项。这是因为库通常不是由链接器创建的,而是由库所摄取的库创建的,而图书馆则不旨在解决所有依赖关系。例如,它不会将依赖项中的所有代码复制到生成的库中。

基本原理是,当链接器构建最终二进制文件时,无论如何都需要做到这一点,这将具有更广泛的观点(例如,在目标平台上,库的静态或动态使用等(,因此,应尽早失败。对于缺少的外部符号几乎没有任何意义。