C++ 编译具有标题的不同.cpp文件
我有个问题 我正在尝试使用GNU g++一起编译多个文件 我们假设有五个文件: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
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
时,编译器不会抱怨,因为它会找到您调用的对象和函数的声明。
链接器的任务是确保它能够找到定义
由于您没有要求编译&linka.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
)!