我正在尝试编译一个由主C文件和两个辅助C ++文件组成的程序。 Main.c 依赖于 Wrapper.cpp ,而 Wrapper.cpp 依赖于 Utility.cpp 。具体来说,Main.c调用Wrapper.cpp中定义的函数 func()。
有趣的问题是我可以从命令行编译程序,但我不能从makefile中编译。我得到一个链接错误“main.o:对func()的引用是未定义的”。这可能主要是因为我理解makefile的概念,但它们可能变得太复杂了!
以下是我从命令行编译的方法:
g++ -c Wrapper.cpp Utility.cpp
gcc -c Main.c Wrapper.cpp
g++ -o myProg Main.o Wrapper.o Utility.o
这是我的makefile:
# Rules to produce the targets
all: Main
Main: Utility.o Main.o Wrapper.o
g++ -o myProg Utility.o Main.o Wrapper.o -lstdc++
# Rules to produce the object files
Utility.o: Utility.cpp
g++ -c Utility.cpp
Wrapper.o: Wrapper.cpp Utility.cpp
g++ -c Wrapper.cpp Utility.cpp
Main.o: Main.c Wrapper.cpp
gcc -c Main.c Wrapper.cpp
我知道我可能正在编译Utility.cpp和Wrapper.cpp两次,但我真的不知道如何编写规则来编译。有人可以给我一些有用的见解。另外请不要给我复杂的makefile,因为我对他们很新。
答案 0 :(得分:1)
您的主要问题是您在想象源文件依赖于其他源文件。这不是真的。您不需要Utility.cpp
的内容来编译Wrapper.cpp
(除非您正在做一些奇怪的事情,例如#include
源文件到其他源文件中。)
同样,目标文件仅依赖于他们正在编译的源文件,以及源文件包含的任何头文件。
可执行文件依赖于构建程序所需的所有目标文件和库。
所以在最简单的情况下你会写(如果你使用-lstd++
,请注意你不需要明确地与g++
链接:
all: Main
Main: Utility.o Main.o Wrapper.o
g++ -o myProg Utility.o Main.o Wrapper.o
# Rules to produce the object files
Utility.o: Utility.cpp
g++ -c Utility.cpp
Wrapper.o: Wrapper.cpp
g++ -c Wrapper.cpp
Main.o: Main.c
gcc -c Main.c
虽然这很容易理解,但它确实消除了make的大部分功能。您可以编写此makefile以获得完全相同的结果:
CXX = g++
CC = gcc
Main: Main.o Utility.o Wrapper.o
就是这样,一切都完成了。