使用标头编译不同的.cpp文件
Compilng different .cpp files with headers
我有问题我正在尝试使用 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.cpp
和b.cpp
以及main.cpp
,因此会出现"未定义的引用"错误。
链接器本质上是在告诉你:"嘿,我找不到某某函数的定义。编译器没有抱怨,因为你包含了包含声明的头文件。
编辑:看到您的评论后,我可以理解您的问题。声明和定义之间是有区别的。
编译器依赖于查找对使用的类、函数、类型和变量的声明。如果您没有包含头文件(试试吧!),您将收到来自编译器的未声明标识符错误。
链接器依赖于查找所用函数和变量的定义。如果未链接包含实现/定义的所需文件,则会收到对 ... 错误的未定义引用,该引用来自链接器。
请阅读 http://linux.die.net/man/1/g++
您需要使用 -c 编译然后链接这些对象
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 如何在cpp文件之间切换窗口?在Qt中
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 库标题在标题中不可见,但在 cmake build 下.cpp文件中完全可见.为什么?
- C++ 链接到单独的.cpp文件说"multiple definitions"
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 如何使用 samtools C API 构建一个简单的主.cpp文件
- 包含在.cpp文件中包含在 .h 文件时包含
- C++(.cpp文件和.h文件)拆分代码并添加一个函数,提取 - 这很容易吗?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 如何使用线程类编译 cpp 文件?
- 使用 Powershell 命令将 cpp 文件的文件夹编译为 GNU 的 g++
- 我应该将外部标头放在 .h 文件还是.cpp文件中?
- 从另一个 cpp 文件更改结构内、映射键内的变量