我是新手制作文件,我把它放在一起试用了一些&错误。这段代码用于编译我的c ++程序。
我的main.cpp文件与makefile位于同一文件夹中。我有一个lib /文件夹,其中包含主要依赖的标题。
以下makefile可以正确完整地编译我的代码。但是我期待着我会发现留下* .o的东西。 (请注意,我已尝试使用和不使用“干净”规则制作两者,并且两次都得到相同的结果。)
#
# Makefile
#
CXX = g++
CCFLAGS = -O3 -I/sw/include -L/sw/lib
## /sw/include and /sw/lib contain dependencies for files in my lib/
LDFLAGS = -lpng
OPTS = $(CCFLAGS) $(LDFLAGS)
SOURCES = $(wildcard lib/*.cpp) main.cpp
OBJECTS = $(SOURCES: .cpp = .o)
TARGET = spirals
$(TARGET): $(OBJECTS)
$(CXX) $(OPTS) $^ -o $@
.PHONY: depend
depend:
g++ -MM $(SOURCES) > depend
## generate dependencies list
include depend
.PHONY: clean
clean:
rm -f *.o lib/*.o $(TARGET)
另外,如果重要,我在MacOSX上,我的程序是用xcode设计的。 (我知道xcode有自己的构建流程,但我正在为linux系统设计命令行程序,我想在bash环境中测试编译和链接,而不是仅仅通过xcode。)
问题:
我是否正确期望makefile在制作主目标后生成* .o文件?
如果是这样,为什么我的makefile不这样做?
答案 0 :(得分:4)
如果您观察$(TARGET)
规则导致运行的命令:
g++ -O3 -I/sw/include -L/sw/lib -lpng lib/bar.cpp lib/foo.cpp main.cpp -o spirals
你会看到$(OBJECTS)
实际上包含* .cpp文件,并且没有* .o文件,因为你没有要求任何文件。
问题在于:
OBJECTS = $(SOURCES:.cpp=.o)
在你编写的GNU makefile中,这个替换引用是用多余的空格写的,所以从不匹配任何东西,$(OBJECTS)
最终与$(SOURCES)
相同。如上所述重写它,它会做你期望的。
(其他注释:-lpng
需要在link命令的末尾开始工作,所以你应该引入另一个make变量(传统上称为$(LDLIBS)
)以便安排它。作为makefile的新手,你最好明确地拼出你的依赖,而不是用$(wildcard)
玩游戏,并且在编译期间需要计算$(OBJECTS)
。-I
选项{{1}在链接期间使用选项,因此最好在单独的规则中安排单独的-L
/ $(CXXFLAGS)
变量,以便仅在需要时添加它们。)