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

Compilng different .cpp files with headers

本文关键字:cpp 文件 编译      更新时间:2023-10-16

我有问题我正在尝试使用 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类(因此包括BH)。

所以在我的主 #include 我刚刚添加了"a.h"

我正在尝试使用

g++ main.cpp -o main

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

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

您需要编译所有源文件:

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

但是你应该做的是使用正确的生成文件:

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

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

由于您没有要求编译和链接a.cppb.cpp以及main.cpp,因此会出现"未定义的引用"错误。

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

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

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

链接器依赖于查找所用函数和变量的定义。如果未链接包含实现/定义的所需文件,则会收到对 ... 错误的未定义引用,该引用来自链接器。

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

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