c++ - 如何在父目录中编写带有标题的 Makefile(用于 c++ 项目)?
问题描述
我目前正在努力制作,非常感谢任何提示或教程。我的项目文件夹结构如下所示:
/project
bar.hpp
/folder1
main.cpp // #include "foo.hpp" #include "bar.hpp"
foo.cpp // #include "foo.hpp" #include "bar.hpp"
foo.hpp // #include "bar.hpp"
Makefile
这在从文件夹 1 调用时编译。
g++-10 -std=c++2a -O3 -fno-pic -no-pie -Wall -I../ main.cpp foo.cpp
我已经编写了以下 Makefile,但它没有按我的预期工作:
CXX = g++-10
CXXFLAGS = -std=c++2a -O3 -fno-pic -no-pie -Wall
CPPFLAGS = -I../
.PHONY : all clean distclean
EXE = a.out
SRC = main.cpp foo.cpp
OBJ = $(SRC: .cpp=.o)
INC = $(wildcard *.hpp) ../bar.hpp
all : $(EXE)
clean :
$(RM) *.o
distclean : clean
$(RM) $(EXE)
$(EXE) : $(OBJ)
$(CXX) $(CXXFLAGS) $^ -o $@
$(OBJ) : $(INC) // I hope this means that all object files depend on all header files?
%.o : %.cpp $(INC)
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@
我从 folder1 中调用 make all,但它不起作用。
我试图寻找 c++ make 教程,但找不到任何具有隐式和模式规则的深度。
这是我得到的错误
g++-10 -std=c++2a -O3 -fno-pic -no-pie -Wall main.cpp foo.cpp -o a.out
main.cpp:1:10: fatal error: bar.hpp: No such file or directory
1 | #include "bar.hpp"
| ^~~~~~~~~
compilation terminated.
In file included from foo.cpp:1:
foo.hpp:1:10: fatal error: bar.hpp: No such file or directory
1 | #include "bar.hpp"
| ^~~~~~~~~
compilation terminated.
我尝试在 folder1 中运行这些命令,并且可以正确编译。
g++-10 -std=c++2a -O3 -fno-pic -no-pie -Wall -c foo.cpp -o foo.o -I../
g++-10 -std=c++2a -O3 -fno-pic -no-pie -Wall -c main.cpp -o main.o -I../
g++-10 -std=c++2a -O3 -fno-pic -no-pie -Wall -o main main.o foo.o
解决方案
这一行是错误的:
OBJ = $(SRC: .cpp=.o)
.cpp
通过在您说的之前添加一个空格,OBJ
应该将变量SRC
中以“ .cpp
”结尾的所有单词替换为结尾.o
。但是变量中没有SRC
以“”结尾的单词 .cpp
,所以不做任何修改,并且 的值与 的值OBJ
相同SRC
。
所以,你的规则是:
a.out : main.cpp foo.cpp
所以没有.o
文件被构建,因为你的目标不依赖于它们。
删除空格:
OBJ = $(SRC:.cpp=.o)
推荐阅读
- javascript - 新的 AngularJS 数据网格和框架
- batch-file - 使用 for 循环批量删除完整的注册表项
- python - 如果其他列中的值相同,则向前或向后填充 NA
- ios - UIVisualEffectView 模糊图像
- date - date-fns - 库以这种格式返回日期 (2018-08-240)
- angular - Angular 6 - 无法使用过滤器方法读取null的属性
- python - python - 如果可用,则打印出来,否则不打印出来
- c# - CefSharp:来自本地资源加载的 HTML,JS,图像未加载
- c# - Android Widget 在调试中工作,但在发布时不工作
- reactjs - 如何在提交之前获取 redux-form 的当前值