生成文件:特定的"无输入文件",自动变量
Makefiles: specific 'no input files', automatic variables
我是制作文件的新手,他们让我感到困惑。我有以下文件夹层次结构:
名为 lib
的文件夹包含拖曳文件夹:include
(带有文件 mylib.h
(和src
(带有文件 mylib.cpp
(。它还包含一个 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
文件。
显然,出了点问题,我无法弄清楚是什么。直到 2 天前,我才知道什么是 Makefiles 以及为什么应该学习如何处理它们,所以我不是那么多专家。
您的构建目标%.o
写错了。不能使用命令部分中的%
,因此目标文件和依赖文件的名称将永远不匹配。
正确的更改是执行以下操作:
%.o: src/%.cpp include/%.h
g++ $(CFLAGS)
-I include
-o $@
-c src/$(@:%.o=%.cpp)
只是为了解释这些更改,-o
需要目标文件,该文件几乎总是以$@
的形式写入 Makefiles,因为这是目标的名称。
其次,源文件需要根据目标进行定义,所讨论的运算符是模式替换运算符$(@:%.o=%.cpp)
,因此它所做的是获取目标 - 这将匹配<blah>.o
文件名,然后它模式匹配将.o
替换为.cpp
。
所以在目标mylib.o
的情况下,变量$@
是mylib.o
的,做$(@:%.o=%.cpp)
的结果是把mylib.o
变成mylib.cpp
。因此,正在编译的是预期的文件,并且正在生成预期的目标。
%
模式的规则被称为隐式规则,用于降低正在编写的代码的复杂性 - 如果您有一堆共享目标模式的文件:blah.o: src/blah.cpp src/blah.h
,那么您使用隐式规则只需要编写目标一次, 然后,您需要根据目标编写命令。
在将变量放入 g++ 之前,必须先做一个变量喜欢:
FT_C= $(src/%.cpp)
FT_O=$(FT_C:.c=.o)
和
g++ $(CFLAGS) -I include -o $(FT_O) -c $(FT_C)
并且不要把你的.h放在编译中 '-I' 就是为了它。
如果你想理解我的意思,看看这个例子:
https://github.com/emericspiroux/wolf3d/blob/master/libft/Makefile
- C++文本文件输入
- C++ 中文件输入输出中的长长 v/s int
- 如何修复函数中的 fstream 文件输入以将正确的信息存储在结构数组中?
- 用空格填充 2D 数组(从文件输入)
- 流对象来表示文件输入,然后是标准输入?
- 用精神解析文件输入
- 从文件输入和输出
- 来自文本文件输入 c++ 的向量
- 如何通过键盘或分数文件输入分数
- 了解文件输入和输出,我可以写入文件,但无法从文件打印
- 词频程序 - 文件输入太大?
- 尝试从 csv 文件输入大量数据时出错
- 如何将文件从文件输入到C 中的矩阵中
- 如何从Windows CMD运行可执行文件并将其传递给文件输入的参数参数和重定向
- 如何解析文本文件并使用构造函数中的文件输入来创建对象的容器
- 这是读取文件输入的正确方法吗?
- 如何在 c++ 中使用二进制文件输入/输出读取/写入结构的字符串类型成员
- 如何创建一个具有空值、递减编号系统和.txt文件输入值的二维阵列网格
- C 文件输入流循环问题
- 使用对输入整数的文件输入