使用标头编译不同的.cpp文件

时间:2013-10-19 04:23:24

标签: c++ header g++

我有问题 我正在尝试使用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

但这不起作用。它给了我一个“未定义的引用”错误。 当我将所有类与头文件

一起编译时,程序为我提供了所需的输出

有人可以告诉我哪里出错了吗

3 个答案:

答案 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.cppb.cpp以及main.cpp,您会收到“未定义的引用”错误。

链接器基本上是在告诉你:“嘿,我找不到某某函数的定义。编译器没有抱怨,因为你包含了带有声明的头文件。”

修改:看到您的评论后,我就能理解您的问题。 声明 定义 之间存在差异。

编译器依赖于查找声明所使用的类,函数,类型和变量。如果你没有包含头文件(试试吧!),你会得到一个来自编译器的未声明的标识符错误

链接器依赖于查找您使用的函数和变量的定义。如果您没有链接包含实现/定义的必需文件,那么您将获得 Undefined reference to ... 错误,该错误来自链接器。

答案 2 :(得分:0)

请阅读http://linux.die.net/man/1/g++

您需要使用-c进行编译,然后链接这些对象