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

时间:2009-08-14 12:52:40

标签: c++ project-management makefile cvs

以下是我的两个问题:

  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中指定目录。这就是我正在做的事情

  3. 生成文件:

    ...
    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`
    

    但是这会产生错误

      

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

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

    谢谢和问候!

5 个答案:

答案 0 :(得分:8)

如果你想学习make,GNU make manual非常好,无论是作为参考还是教程。您可能需要考虑使用 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)

答案 1 :(得分:2)

  1. 您的目录结构似乎很合理。

  2. 我会为执行编译器制定明确的规则,例如

  3. TARGET_DIR=bin
    SRC_DIR=src
    CXX=g++
    CXXFLAGS=
    ETC=
    
    OBJS=$(TARGET_DIR)/test.o
    
    all: $(OBJS)
    
    $(TARGET_DIR)/%.o: $(SRC_DIR)/%.cc
            $(CXX) -c -o $@ $(CXXFLAGS) $(ETC) $<
    

答案 2 :(得分:2)

  1. 如果您愿意,可以将文件保存在不同的目录中,但这不是必需的。将文件或目录添加到CVS存储库一次,CVS将无限期地保留它。从那时起,您可以更新它,检查它,等等。如果您不将对象文件添加到存储库,CVS将不会触及它。如果你想要添加一个完整的目录树,并且你习惯于把对象保存在那里,那就在你做之前先做好清理。

  2. Make是一个很棒的工具,但它有一些明显的缺点。你所描述的是经典问题之一:Make善于使用源 来制作 here ,但不是相反。这里有几种方法可以做你想做的事

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

        ...
        all: myexecutable TAGS
    
        myexecutable: 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)学习一些更先进的制作技巧。你可能不应该尝试这个。

答案 3 :(得分:0)

使用automakeautoconf构建项目。

至于文件的结构,只需查看任何大型开源C ++应用程序。任何KDE应用程序 对此事情会好起来的。如果您发现使用C ++和Python的应用程序更好。

答案 4 :(得分:-5)

为什么不选择eclipse,这对于管理大型项目非常流行和方便。您可以在eclipse中创建一个新项目,从其他项目导入 - 导出代码到项目中,也可以为您执行版本控制等。不需要编写make文件,eclipse会根据您在GUI中提到的首选项为您执行此操作。 如果您参与了C ++项目,只需在eclipse上安装CDT插件即可完成。