C++ makefile:specific';没有输入文件';,自动变量
我不熟悉制作文件,它们让我困惑。我有以下文件夹层次结构: 名为C++ makefile:specific';没有输入文件';,自动变量,c++,makefile,automatic-variable,C++,Makefile,Automatic Variable,我不熟悉制作文件,它们让我困惑。我有以下文件夹层次结构: 名为lib的文件夹包含两个文件夹:include(使用文件mylib.h)和src(使用文件mylib.cpp)。它还包含一个Makefile,出于某种原因,它给了我一个错误 完整的makefile是: CFLAGS = -Wall -fPIC OBJECTS = mylib.o all: libmine.so libmine.so: $(OBJECTS) g++ -shared $(CFLAGS) \
lib
的文件夹包含两个文件夹:include
(使用文件mylib.h
)和src
(使用文件mylib.cpp
)。它还包含一个Makefile,出于某种原因,它给了我一个错误
完整的makefile是:
CFLAGS = -Wall -fPIC
OBJECTS = mylib.o
all: libmine.so
libmine.so: $(OBJECTS)
g++ -shared $(CFLAGS) \
-o libmine.so \
$(OBJECTS)
%.o: src/%.cpp include/%.h
g++ $(CFLAGS) \
-I include \
-o %.o \
-c src/%.cpp
clean:
rm src/*.o
rm libmine.so
错误是
mr209@Quantum:~/Desktop/hw1/lib$ make
g++ -Wall -fPIC \
-I include \
-o %.o \
-c src/%.cpp
g++: error: src/%.cpp: No such file or directory
g++: fatal error: no input files
compilation terminated.
make: *** [mylib.o] Error 4
但是文件存在。因此,make
正在做一些奇怪的事情,导致它无法找到.cpp
文件
为了使libmine.so
,g++
必须使用mylib.o
,对于一个通用.o
文件,我已经编写了一些代码行
以下是我的想法:为了使libmine.so
,g++
必须对mylib.o
做些什么。因此,在lib
中,必须出现一个名为mylib.o
的文件。使用通用的%.0
规则,此文件由src
中的mylib.cpp
和include
中的mylib.h
组成(因此是%.o
规则的第一行)。该文件是使用g++
生成的,它必须在include
中查找附加头,生成mylib.o
作为输出,并编译src/mylib.cpp
,但-c
保证生成.o
文件
很明显,有些地方出了问题,我不知道是什么。就在两天前,我才了解了Makefiles是什么,以及为什么要学习如何处理它们,所以我不是一个专家。在将变量放入g之前,必须先做一个变量++ 比如:
FT_C=$(src/%.cpp)
FT_O=$(FT_C:.C=.O)
及
g++$(CFLAGS)-I包括-o$(FT\u-o)-c$(FT\u-c)
不要把你的.h放在编译中,'-I'是为它而来的
如果你想理解我的意思,请看这个例子:
您的构建目标
%.o
写错了。您不能在命令部分使用%
,因此目标文件和从属文件的名称永远不会匹配
正确的更改是执行以下操作:
%.o: src/%.cpp include/%.h
g++ $(CFLAGS) \
-I include \
-o $@ \
-c src/$(@:%.o=%.cpp)
为了解释这些更改,-o
需要目标文件,它在Makefiles中几乎总是以$@
的形式写入,因为这是目标文件的名称
其次,源文件需要根据目标来定义,所讨论的操作符是模式替换操作符$(@:%.o=%.cpp)
,因此它所做的是获取目标-它将匹配文件名.o
,然后它将.o
替换为.cpp
因此,对于目标mylib.o
,变量$
是mylib.o
,执行$(@:%.o=%.cpp)
的结果是将mylib.o
转换为mylib.cpp
。因此,正在编译的是预期的文件,预期的目标是build
使用%
模式的规则称为隐式规则,用于降低编写代码的复杂性-如果有一堆文件共享目标模式:blah.o:src/blah.cpp src/blah.h
,则使用隐式规则只需编写一次目标,然后需要根据目标编写命令