链接多个文件时,架构x86_64的未定义符号

时间:2018-03-21 18:57:36

标签: c++ makefile

我正在尝试使用g ++链接三个文件。文件为simulation.olattice.othermodynamics.o

它们有点长,但它的要点是。我有一个makefile:

            main: simulation.o thermodynamics.o lattice.o
                g++ simulation.o thermodynamics.o lattice.o

            simulation.o: simulation.cpp lattice.o lattice.h thermodynamics.o thermodynamics.h
                g++ -std=c++11 simulation.cpp -o simulation.o -c

            thermodynamics.o: thermodynamics.cpp
                g++ -std=c++11 thermodynamics.cpp -o thermodynamics.o -lgsl -c

            lattice.o: lattice.cpp
                g++ -std=c++11 lattice.cpp -o lattice.o -c

它通过编译阶段,但从不链接它们。对于我需要来自不同文件的每个方法,它只是说它是未定义的,并且拒绝找到它们。

类和方法都在.h文件中定义。但由于某种原因,我可以定义一个外部函数,但不能定义外部类。

2 个答案:

答案 0 :(得分:1)

无法链接,因为makefile在编译时使用链接器标志。而链接时必须使用链接器标志。

更正:

CXXFLAGS := -std=c++11 -Wall -Wextra

main: simulation.o thermodynamics.o lattice.o
    g++ -o main simulation.o thermodynamics.o lattice.o -lgsl

simulation.o: simulation.cpp lattice.h  thermodynamics.h
    g++ -c ${CXXFLAGS} -o simulation.o simulation.cpp 

thermodynamics.o: thermodynamics.cpp thermodynamics.h
    g++ -c ${CXXFLAGS} -o thermodynamics.o thermodynamics.cpp 

lattice.o: lattice.cpp lattice.h
    g++ -c ${CXXFLAGS} -o lattice.o lattice.cpp 

答案 1 :(得分:0)

我弄清楚出了什么问题。与我在文件之间拆分类的方式有关。

我在.h文件中声明了这些类,然后在.cpp个文件中重新声明了它们。相反,我应该使用class::method(params)形式的实现来填充cpp文件。

此外,我没有#include .h文件中的.cpp文件。

最后,我也有错误的联系顺序:正如@Maxim Egorushkin指出的那样,关联的顺序很重要。我应该一次性链接文件,而不是在最后阶段。

感谢所有回答的人!