0

我有一个问题,我正在尝试使用 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 类(因此包括 ah),A 类使用 B 类(因此包括 bh)。

所以在我的主要内容中,我刚刚添加了#include "ah"

我正在尝试使用

g++ main.cpp -o main

但这不起作用。它给了我一个“未定义的引用”错误。当我将所有类与头文件一起编译时,该程序为我提供了所需的输出

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

4

3 回答 3

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
于 2013-10-19T04:25:36.670 回答
2

当您 build onlymain.cpp时,编译器不会抱怨,因为它会找到您调用的对象和函数的声明。链接器的工作是确保它可以找到定义。

由于您没有要求编译和链接a.cpp以及b.cpp与 一起main.cpp,您会收到“未定义的引用到”错误。

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

编辑:看到您的评论后,我可以理解您的问题。声明定义是有区别的。

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

链接器依赖于查找您使用的函数和变量的定义。如果你没有链接包含实现/定义的所需文件,你会得到一个Undefined reference to ...错误,它来自链接器。

于 2013-10-19T04:27:45.723 回答
0

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

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

于 2013-10-19T04:27:28.810 回答