Tim*_*Tim 6 c++ cvs project-management makefile
这是我的两个问题:
我现在正在学习使用CVS管理我的代码,我只想为我的C++文件,Makefile和bash以及python脚本创建一个存储库,而不是目标文件和可执行文件.所以我在我的项目目录下创建了几个子目录:src,bin,scripts,results和data.我把〜/ myproject/src下的C++文件和Makefile,〜/ myproject/scripts下的bash和python脚本以及〜/ myproject/bin下的对象和可执行文件放在下面.我希望只有src和脚本下的文件才能通过CVS更新.我想知道你们是如何组织你的项目的?只希望遵循一些好习惯
由于我将我的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`
但是这会给出错误
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)
如果您愿意,您可以将文件保存在不同的目录中,但这不是必需的。将文件或目录添加到 CVS 存储库一次,CVS 将无限期保留它。从那时起,您可以更新它,签入它,等等。如果您不将目标文件添加到存储库,CVS 将不会触及它。如果您想添加整个目录树,并且您习惯将对象保留在那里,那么只需在执行此操作之前进行清理即可。
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 技术。你可能还不应该尝试这个。