链接在与另一个链接的库中链接
Linking against a library that links against another one
当我创建一个链接到外部库(线性代数,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
我相信您需要在链接二进制文件时指定库的所有依赖项。这是因为库通常不是由链接器创建的,而是由库所摄取的库创建的,而图书馆则不旨在解决所有依赖关系。例如,它不会将依赖项中的所有代码复制到生成的库中。
基本原理是,当链接器构建最终二进制文件时,无论如何都需要做到这一点,这将具有更广泛的观点(例如,在目标平台上,库的静态或动态使用等(,因此,应尽早失败。对于缺少的外部符号几乎没有任何意义。
相关文章:
- 将库链接到另一个应用程序时,CMAKE 找不到库
- 将一个 QWidget 链接到另一个新创建的 QWidget
- 如何将数据从一个结构链接到另一个结构
- 是否可以将 EXE 文件作为 lib 文件链接到另一个项目?
- 无法在 CMake 中创建动态库并将其链接到另一个动态库?
- 如何将一个 exe 项目链接到另一个 exe 项目中的类
- 链接另一个文件中的函数时,Qt 上出现错误 LNK 2019
- QMAKE:将静态库链接到另一个静态库
- CMAKE:将静态库从子目录链接到另一个子目录中的可执行文件
- 如何根据目标体系结构将共享库链接到另一个共享库
- 如何将包含其他第三方C库的C++项目a链接到另一个项目B
- 链接另一个静态库中的静态库
- 我可以创建一个链接另一个库但不依赖于其include的c++库吗
- 链接到链接到另一个共享库的共享库会在退出时出错
- 将共享库链接到另一个共享库
- GCC - 链接到另一个文件夹中的库有效,但二进制文件不会运行
- 如何在C++中将一个.exe链接到另一个.exe
- 如何减少从一个升压链到另一个升压链的延迟
- 链接/注册一个.so文件
- 将程序链接到静态库,并将程序本身链接到另一个库