Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译具有标题的不同.cpp文件_C++_Header_G++ - Fatal编程技术网

C++ 编译具有标题的不同.cpp文件

C++ 编译具有标题的不同.cpp文件,c++,header,g++,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

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

因此,在我的主要内容中,我刚刚添加了“包括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
但您应该使用适当的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
请阅读


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

当您仅构建
main.cpp
时,编译器不会抱怨,因为它会找到您调用的对象和函数的声明。 链接器的任务是确保它能够找到定义

由于您没有要求编译&link
a.cpp
b.cpp
以及
main.cpp
,因此会出现“未定义引用”错误

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

编辑:看到您的评论后,我可以理解您的问题。声明定义之间存在差异

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


链接器依赖于查找所用函数和变量的定义。如果您没有链接包含实现/定义的必需文件,您将得到一个未定义的对。。。错误,来自链接器。

甚至不要考虑将一个.cpp文件包含在另一个.cpp文件中。只是提前告诉你。如果你发现自己认为这是个好主意,再想想。然后看下面的答案。没有理由在头文件中只放一个类。头文件可以(通常应该)包含几个相关的声明(类、函数等)和内联函数定义。对于像您这样的小项目,只有一个头文件(可以预编译)是有意义的。与
*.cpp
文件相比,您可以拥有更少的
*.h
文件。@user2803194-这是为了让他们彼此了解,我不确定我是否了解;头文件包含在源文件中,对吗?头文件只包含类的声明。所有的实现都在.cpp文件中(不一定总是这样)。通过包含头文件,可以避免编译器错误:“变量abc和函数xyz未声明”@user2803194 Modularity。标题包含结构和功能规定的声明;.cpp文件包含后者的实际实现(以及在.cpp文件之外不需要的本地声明)。标头是一个.cpp文件“知道”另一个文件提供了什么,并正确利用该文件的“管道”。但是这些实现需要链接在一起才能实现。@CarlNorum:你忘了在你的
cxflags
中加入
-Wall-g
(除了
-MMD
)!