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

这是我的两个问题:

  • 我现在正在学习使用CVS管理我的代码,我只想为我的C ++文件,Makefile和bash和python脚本创建一个存储库,而不是目标文件和可执行文件。 所以我在我的项目目录下创建了几个子目录:src,bin,脚本,结果和数据。 我将〜/ 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 / myexecutable /home/myproject/bin/myobject.o', needed by目标/home/myproject/bin/myobject.o', needed by '。

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

    感谢致敬!


  • 如果你喜欢,你可以将你的文件保存在不同的目录中,但这不是必需的。 将文件或目录添加到CVS存储库一次,并且CVS将无限期地保留它。 从那时起,你可以更新它,检查它,不管。 如果你没有添加一个目标文件到版本库中,CVS将不会触及它。 如果你想添加一个完整的目录树,并且你习惯于保留对象,那么在做之前先清理一下。

  • Make是一个很棒的工具,但它有一些明显的缺点。 你所描述的是一个经典问题:Make擅长使用源代码在这里创造一些东西,而不是相反。 这里有几种方法来做你想做的事情。

  • 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)学习一些更高级的制作技巧。 你可能不应该尝试这个。


    如果你想学习make,GNU make手册非常好,既可以作为参考,也可以作为教程。 您可能要考虑使用patsubst命令。 以下是我自己使用它的makefiles的一个简化版本:

    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)
    

  • 你的目录结构看起来很明智。

  • 我会为执行编译器制定一个明确的规则,例如

  • 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) $<
    
    链接地址: http://www.djcxy.com/p/97105.html

    上一篇: organize project and specify directory for object files in Makefile

    下一篇: What are the uses of the exec command in shell scripts?