可以从命令行编译,但不能从makefile编译

时间:2014-03-04 14:12:51

标签: compilation linker makefile

我正在尝试编译一个由主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,因为我对他们很新。

1 个答案:

答案 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

就是这样,一切都完成了。

相关问题