我有问题 我正在尝试使用GNU g ++编译多个文件
我们假设有五个文件:
main.cpp : the main function
a.h : the header file of class A
a.cpp : the definition of class A
b.h : the header file of class B
b.cpp : the definition of class B
在程序中,main.cpp使用类A(因此包括a.h)和类A使用 B类(因此包括b.h)。
所以在我的主要内容中我刚刚添加了#include“a.h”
我正在尝试使用
编译它g++ main.cpp -o main
但这不起作用。它给了我一个“未定义的引用”错误。 当我将所有类与头文件
一起编译时,程序为我提供了所需的输出有人可以告诉我哪里出错了吗
答案 0 :(得分:6)
您需要编译所有源文件:
g++ main.cpp a.cpp b.cpp -o main
如果你想分步进行,你也可以这样做:
g++ -c main.cpp -o main.o # compile
g++ -c a.cpp -o a.o # compile
g++ -c b.cpp -o b.o # compile
g++ -o main main.o a.o b.o # link
但应该正在做的是使用正确的makefile:
CXXFLAGS = -MMD
OBJECTS = main.o a.o b.o
MAKEDEPS = $(OBJECTS:.o=.d)
main: $(OBJECTS)
$(CXX) $(CXXFLAGS) -o $@ $^
clean:
rm -f *.d *.o main
.PHONY: clean
-include $(MAKEDEPS)
示例:
$ make
c++ -MMD -c -o main.o main.cpp
c++ -MMD -c -o a.o a.cpp
c++ -MMD -c -o b.o b.cpp
c++ -MMD -o main main.o a.o b.o
答案 1 :(得分:2)
当你只构建main.cpp
时,编译器不会抱怨,因为它找到了你调用的对象和函数的声明。
链接器的工作是确保它可以找到定义。
因为你没有要求编译&链接a.cpp
和b.cpp
以及main.cpp
,您会收到“未定义的引用”错误。
链接器基本上是在告诉你:“嘿,我找不到某某函数的定义。编译器没有抱怨,因为你包含了带有声明的头文件。”
修改:看到您的评论后,我就能理解您的问题。 声明 与 定义 之间存在差异。
编译器依赖于查找声明所使用的类,函数,类型和变量。如果你没有包含头文件(试试吧!),你会得到一个来自编译器的未声明的标识符错误。
链接器依赖于查找您使用的函数和变量的定义。如果您没有链接包含实现/定义的必需文件,那么您将获得 Undefined reference to ... 错误,该错误来自链接器。
答案 2 :(得分:0)
请阅读http://linux.die.net/man/1/g++
您需要使用-c进行编译,然后链接这些对象