Compilation 可以从命令行编译,但不能从生成文件编译 我试图编译一个由主C文件和两个辅助C++文件组成的程序。 Main.c依赖于Wrapper.cpp,而Wrapper.cpp又依赖于Utility.cpp。具体来说,Main.c调用Wrapper.cpp中定义的函数func()
有趣的是,我可以从命令行编译程序,但不能从makefile编译。我得到一个链接错误“main.o:对func()的引用未定义”。这可能主要是因为我理解makefile的概念,但它们可能太复杂了 以下是我如何从命令行编译: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
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)目标。