为什么我的make文件不会留下目标文件?

时间:2012-06-28 18:23:41

标签: makefile

我是新手制作文件,我把它放在一起试用了一些&错误。这段代码用于编译我的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。)

问题:

  1. 我是否正确期望makefile在制作主目标后生成* .o文件?

  2. 如果是这样,为什么我的makefile不这样做?

1 个答案:

答案 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)变量,以便仅在需要时添加它们。)