makefile中的-I标志不会导致找到头文件
-I flag in the makefile does not result in a header file being found
我有一个文件。/src/test.cpp:
#include "test.h"
void Hi() {
std::cout << "Hi, indeed..." << std::endl;
}
test.h位于。/include文件夹。
这是我的makefile:
CC = g++
CFLAGS = -Wall
INCLUDES = -I./include
SRCS = $(shell find ./src/ -name '*.cpp')
.PHONY: clean depend
OBJS = $(SRCS:.cpp=.o)
OBJS := $(OBJS:./src%=.%)
release: $(OBJS)
$(CC) $(CFLAGS) -o app_name $(OBJS)
VPATH = ./src
../%.o: %.cpp
$(CC) $(CFLAGS) $(INCLUDES) -c $*.cpp
depend: .depend
.depend: $(SRCS)
rm -f ./.depend
$(CC) $(CFLAGS) -MM $^ > ./.depend;
include .depend
结果我得到一个错误:
g++ -c -o test.o ./src/test.cpp
./src/test.cpp:1:18: fatal error: test.h: No such file or directory
compilation terminated.
<builtin>: recipe for target 'test.o' failed
make: *** [test.o] Error 1
文件.depend
是完全空的。
如何解决这个问题?makefile位于根目录:
./
makefile
./src/
test.cpp
main.cpp
./include/
test.h
gm想说的是你已经定义了一个模式规则,它知道如何构建一个匹配模式../%.o
的目标。但是,当你要求make构建对象时,它们的形式是./xxx.o
;如后:
SRCS = $(shell find ./src/ -name '*.cpp')
假设SRCS
包含./src/foo.cpp
。在这之后:
OBJS = $(SRCS:.cpp=.o)
OBJS := $(OBJS:./src%=.%)
OBJS
将包含值./foo.o
(顺便说一下,获得此行为的更简单方法是使用patsubst
函数:$(patsubst ./src/%.cpp,./%.o,$(SRCS))
)。
./foo.o
。因为没有明确的规则,所以它会寻找一个隐含的规则。
它看到你的模式规则,但是它说的是如何构建../%.o
,这与make想要构建./foo.o
的目标文件不匹配,所以你的规则被忽略。
然后make会去寻找一些其他隐式规则,它会找到内置规则,知道如何从.cpp
文件构建.o
文件,它将使用它。该规则没有使用变量$(INCLUDES)
,所以编译失败。
您需要修复您的OBJS
设置,以创建像../foo.o
而不是./foo.o
这样的文件名,如果您真的希望您的目标文件出现在父目录中,或者更改您的模式规则以构建%.o
而不是../%.o
。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 文本文件中的单词链表
- 如何将 txt 文件中的行分隔为组件C++
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- C++将文本文件中的数据读取到结构数组中
- 如何计算文件中的"columns"数?
- 如何使用单独文件中的派生类访问友元函数对象
- 如何在C++中确定文本文件中的元素是字符还是数字
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 在gem5中打印文件中的所有cache_blocks
- 找不到QtResource文件中的文件
- 区分非成员函数和头文件中的成员函数
- 编辑文件中的文本
- 使用fstream对txt文件中的数字进行循环
- 调用 C 文件中的"C++"结构
- sqlite3 和生成文件中的链接出现问题
- 如何在 C++ 中将文件中的逗号分隔数字读取到数组中?
- 如何使用文件中的文本,例如变量
- 整数键映射到头文件中的成员函数指针
- C++ 使用存储在动态数组中的文本文件中的数据查找模式