组织项目并在Makefile中指定目标文件的目录

Tim*_*Tim 6 c++ cvs project-management makefile

这是我的两个问题:

  1. 我现在正在学习使用CVS管理我的代码,我只想为我的C++文件,Makefile和bash以及python脚本创建一个存储库,而不是目标文件和可执行文件.所以我在我的项目目录下创建了几个子目录:src,bin,scripts,results和data.我把〜/ myproject/src下的C++文件和Makefile,〜/ myproject/scripts下的bash和python脚本以及〜/ myproject/bin下的对象和可执行文件放在下面.我希望只有src和脚本下的文件才能通过CVS更新.我想知道你们是如何组织你的项目的?只希望遵循一些好习惯

  2. 由于我将我的C++文件和Makefile放入〜/ myproject/src以及对象和可执行文件到〜/ myproject/bin中,我必须在Makefile中指定目录.这就是我在做的事情

Makefile文件:

...
BIN_DIR=/home/myproject/bin/

all: $(BIN_DIR)myexecutable TAGS

TAGS: *.cc *.h
    etags --members --declarations -l c++ *.cc *.h

$(BIN_DIR)myexecutable: $(BIN_DIR)myobject.o
    $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

Makefile.depend: *.h *.cc Makefile
    $(CXX) -M $(CXXFLAGS) *.cc > Makefile.depend

clean:
    \rm -f $(BIN_DIR)myexecutable $(BIN_DIR)*.o Makefile.depend TAGS`
Run Code Online (Sandbox Code Playgroud)

但是这会给出错误

make:***没有规则来制作目标/home/myproject/bin/myobject.o', needed by/ home/myproject/bin/myexecutable'.

如何在Makefile中的C++文件中为对象和可执行文件指定不同的目录?

感谢致敬!

小智 8

如果你想学习make,那么GNU make手册非常好,无论是作为参考还是教程.您可能需要考虑使用patsubst命令.以下是我自己的一个使用它的makefile的简化版本:

OUT = bin/csvfix.exe
CC = g++
IDIR = inc
ODIR = obj
SDIR = src
INC = -Iinc -I../alib/inc
LIBS = ../alib/lib/alib.a -lodbc32 

_OBJS = csved_atable.o \
        csved_case.o \
        csved_cli.o \
        csved_command.o \
        csved_date.o \

OBJS = $(patsubst %,$(ODIR)/%,$(_OBJS))

$(ODIR)/%.o: $(SDIR)/%.cpp 
    $(CC) -c $(INC) -o $@ $< $(CFLAGS) 

$(OUT): $(OBJS)
    $(CC) -o $@ $^ $(CFLAGS) $(LIBS)
    strip $(OUT)

clean:
    rm -f $(ODIR)/*.o $(OUT)
Run Code Online (Sandbox Code Playgroud)


Bet*_*eta 2

  1. 如果您愿意,您可以将文件保存在不同的目录中,但这不是必需的。将文件或目录添加到 CVS 存储库一次,CVS 将无限期保留它。从那时起,您可以更新它,签入它,等等。如果您不将目标文件添加到存储库,CVS 将不会触及它。如果您想添加整个目录树,并且您习惯将对象保留在那里,那么只需在执行此操作之前进行清理即可。

  2. Make 是一个很棒的工具,但它也有一些明显的缺陷。您所描述的是经典问题之一:Make 擅长使用那里的源来在这里制作一些东西,但反之则不然。这里有几种方法可以帮助您完成您想要做的事情。

A) 在二进制目录中运行 make:

    ...
    全部:我的可执行文件 标签

    我的可执行文件:myobject.o
        $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

    VPATH = /home/myproject/src
    ...

cd ~/myproject/bin
make -f ../src/makefile

B) 通过暴力方式将对象放入 bin 目录中:

    $(BIN_DIR)%.o: %.cc
        $(CXX) $(CXXFLAGS) -c -o $@ $^

这会给你带来 Makefile.depend 的问题,你可以通过多种方式解决这个问题。

C) 学习一些更高级的 Make 技术。你可能还不应该尝试这个。