我正在尝试使用g ++链接三个文件。文件为simulation.o
,lattice.o
和thermodynamics.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
文件中定义。但由于某种原因,我可以定义一个外部函数,但不能定义外部类。
答案 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指出的那样,关联的顺序很重要。我应该一次性链接文件,而不是在最后阶段。
感谢所有回答的人!