我是linux的新手,也是makefile的新手,所以我在这一点上有点难过。我现在一直盯着制作手册一小时,我想我会问:
我想为一个相对较小的项目创建一个makefile,其源文件位于proj/src/
,并且位于该位置的子目录中。我在proj/makefile
编写了一个makefile,并希望用它来收集所有源文件,找到它们的依赖项,并将结果编译成proj/build/
。这是我写的:
# here are my files and directories (there are also header files that are not
# listed here, but these are referred to from within the .cpp files with
# respect to the proj/src directory)
# proj/makefile
# proj/src/
# proj/src/main.cpp
# proj/src/dir1/
# proj/src/dir1/source1.cpp
# proj/src/dir2/
# proj/src/dir2/source2.cpp
# proj/build/
srcDir = src/
buildDir = build/
# This is a list of all the object files (can I get this programatically?)
objects = main.o source1.o source2.o
all: prog
# Here I want to compile all source (.cpp) files from src/ and all of its subdirectories, and to find the dependencies I want to call g++ -MM to automatically generate the list:
%.o: %.cpp
$(CXX) $(CXXFLAGS) -MM -I $(srcDir)
clean:
rm -rf *o $(buildDir)/prog
这远非功能性但我想在问之前先给它。运行此命令
制作: * 没有规则可以制作目标
main.o', needed by
编辑'。停止。
所以大概我尝试自动编写目标文件失败了。如果有人可以给我一些很棒的方向,我希望在评论和代码之间你可以明白这个意图。
编辑:我现在尝试了以下内容:
SHELL := /bin/bash
srcDir = src
buildDir = bin
sources := $(shell find $(srcDir) -name *.cpp)
objects := $(sources:%.cpp=%.o)
-include $(sources:%.cpp=%.d)
# This is a list of all the object files (can I get this programatically?)
all: prog
prog: $(objects)
g++ $(objects) -o $(buildDir)/prog
# Here I want to compile all source (.cpp) files from src/ and all of its subdirectories, and to find the dependencies I want to call g++ -MM to automatically generate the list:
%.o: %.cpp
$(CXX) $(CXXFLAGS) -MMD -MP -c -I $(srcDir)
clean:
rm -rf *o $(buildDir)/hello
但是当我运行这个时,我收到以下错误:
g++ -MMD -MP -I src
g++: fatal error: no input files
compilation terminated.
make: *** [src/core/Cell.o] Error 1
答案 0 :(得分:2)
它希望从main.o
构建main.cpp
,但顶层没有main.cpp
。您可以指定目标文件的完整路径,如果它们与源文件一起构建:
objects = $(srcDir)/main.o $(srcDir)/dir1/source1.o $(srcDir)/dir2/source2.o
我能以编程方式得到这个吗?
我使用gnumake' shell
函数
SHELL := /bin/bash
sources := $(shell find $(srcDir) -name *.cpp)
objects := $(sources:%.cpp=%.o)
找到我想调用g ++ -MM以自动生成列表的依赖项
使用-MMD
生成依赖项文件以及编译。在此处指定-MP
也是一个好主意 - 这可以确保在删除标头时正确更新依赖关系。给定上面定义的变量,您可以使用
-include $(sources:%.cpp=%.d)