Compilation 可以从命令行编译,但不能从生成文件编译 我试图编译一个由主C文件和两个辅助C++文件组成的程序。 Main.c依赖于Wrapper.cpp,而Wrapper.cpp又依赖于Utility.cpp。具体来说,Main.c调用Wrapper.cpp中定义的函数func()

Compilation 可以从命令行编译,但不能从生成文件编译 我试图编译一个由主C文件和两个辅助C++文件组成的程序。 Main.c依赖于Wrapper.cpp,而Wrapper.cpp又依赖于Utility.cpp。具体来说,Main.c调用Wrapper.cpp中定义的函数func(),compilation,linker,makefile,Compilation,Linker,Makefile,有趣的是,我可以从命令行编译程序,但不能从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 ta

有趣的是,我可以从命令行编译程序,但不能从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,因为我对它们很陌生。

您的主要问题是您认为源文件依赖于其他源文件。那不是真的。编译
Wrapper.cpp
不需要
Utility.cpp
的内容(除非您正在做一些奇怪的事情,比如
#将源文件包含到其他源文件中)

类似地,对象文件只依赖于它们正在编译的源文件,以及源文件包含的任何头文件

可执行文件依赖于构建程序所需的所有目标文件和库

因此,在最简单的情况下,您可以编写(注意,如果您使用
g++
,则不需要显式链接到
-lstd++

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的大部分功能。您可以编写此make文件以获得完全相同的结果:

CXX = g++
CC = gcc

Main: Main.o Utility.o Wrapper.o

就这样,全部完成。

非常感谢您的反馈。在上面的简明makefile中,我如何使用变量CXX和CC?您不需要使用它们。Make有许多内置规则,这些规则使用许多预定义变量。这个简明makefile利用了这些内置规则,其中一个告诉Make如何o从
.cpp
构建
.o
,另一个告诉make如何从
.o
构建程序(前缀名称相同)。这些内置规则使用变量,如
CXX
CC
cppfags
cxflags
,等等。因此,通过设置这些变量,您可以更改规则的工作方式,而无需重新定义规则本身。请参阅GNU make手册,或运行
make-pf/dev/null
查看所有规则。非常感谢您提供的非常有用的帮助我编写了以下makefile XX=g++CC=gcc CFLAGS=-std=c99 cxflags=-o myProg all:Main.o Utility.o Wrapper.o…..编译时,我不再得到原始引用未定义的错误,所以这很好。但是,不生成可执行文件,即只生成对象文件,不链接它们在命令行中,可执行文件被愉快地生成。请帮我解决这个问题。很难准确地看到您在未格式化的注释中做了什么,但一般来说,将
-o
标记添加到
cxflags
CFLAGS
是不正确的。
-o
标记是特定于给定目标的,而这些变量用于构建每个(C++/C)目标。