创建将.o存储到目录的makefile c ++

时间:2016-04-18 19:39:17

标签: c++ c makefile

以下是我的数据存储方式示例:

\Program
     main.cpp
     makefile
     \Part1
          file1.cpp
          file1.h
          file2.cpp
          etc
     \Part2
          file3.cpp
          file4.cpp
          file4.h
          etc..
     \Part3
          file5.cpp
          file5.h
          etc..

     \Objects
          file1.o
          file2.o
          file3.o
          file4.o

我想你明白了。

我的问题是,无论我尝试使用我的makefile都不起作用

  

clang:错误:没有输入文件

  

架构x86_64的未定义符号:

好吧,我试着自己学习如何构建一个makefile。我最简单的方式是:

all:exe
exe: Objects/file1.o Objects/file2.o Objects/file3.o Objects/file4.o Objects/file5.o .....
     $(CPP) $(LFLAGS) Objects/file1.o Objects/file2.o Objects/file3.o ... -o exe

然后,对于每个.o我要求makefile做:

Objects/file1.0: Part1/file1.cpp
         $(CPP) $(CFLAGS) -o $(OBJ/file1).o Part1/file1.o

但我一直有这个问题:

  

makefile:XX:警告:覆盖目标.o' makefile:XX: warning: ignoring old commands for target的命令.o'

对于每个文件

我试图学习如何更加正确地构建makefile,但这很困难。我尝试过很多很多东西而且它没有用。

当我说一个写makefile的正确方法时,这就是我的意思

ALL_CPP=Part1/*.cpp, Part2/*.cpp, Part3/*.cpp, Part4/*.cpp
CPP_FILES := $(wildcard $(ALL_CPP))
OBJ_FILES = $(patsubst $(ALL_CPP),Objects/%.o,$(CPP_FILES))

main: $(OBJ_FILES)
    g++ -o $@ $^

Objects/%.o: Animal/%.cpp
    g++ $(CFLAGS) -c -o $@ $<
Objects/%.o: Enclos/%.cpp
    g++ $(CFLAGS) -c -o $@ $<
Objects/%.o: Menu/%.cpp
    g++ $(CFLAGS) -c -o $@ $<
Objects/%.o: Zoo/%.cpp
    g++ $(CFLAGS) -c -o $@ $<

但当然它不起作用。

我的问题是:

如何创建一个makefile,它可以在我的环境(使用不同的子文件夹)中工作,并将.o存储在专用文件夹中。

我使用xcode但不幸的是我想要一个菜单​​,您可以使用不能在xcode控制台上工作的箭头进行导航。

1 个答案:

答案 0 :(得分:3)

你的第二次尝试非常接近。

问题在于这一行

for

OBJ_FILES = $(patsubst $(ALL_CPP),Objects/%.o,$(CPP_FILES)) 的第一个参数是要匹配的模式,但$(patsubst)不是模式。您希望每个目录都有$(ALL_CPP)。如果您真的想要,可以制作模式列表,但有更好的方法。

这里你真的有两个转换。一个用dir/%.c替换任何前导目录,另一个用Objects替换.cpp

分开做。

第一部分使用Substitution Reference

.o

以及第二部分的OBJ_FILES := $(CPP_FILES:.cpp=.o) notdir file name functions

addprefix

这应该可以使事情发挥作用。