[英]organize project and specify directory for object files in 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 ++文件中为对象和可执行文件指定不同的目录?
如果你想学习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)
你的目录结构似乎很合理。
我会为执行编译器制定一个明确的规则,比如
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) $<
如果您愿意,可以将文件保存在不同的目录中,但这不是必需的。 将文件或目录添加到CVS存储库一次,CVS将无限期地保留它。 从那时起,您可以更新它,检查它,等等。 如果您不将对象文件添加到存储库,CVS将不会触及它。 如果你想要添加一个完整的目录树,并且你习惯于在那里保留对象,那么在你做之前先做好清理。
Make是一个很棒的工具,但它有一些明显的缺点。 to make something , but not the other way around. 什么你所描述的经典问题之一:让善于使用源 ,使的东西,而不是周围的其他方法。 这里有几种方法可以做你想做的事情。
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)学习一些更先进的制作技巧。 你可能不应该尝试这个。
为什么不选择eclipse,这对于管理大型项目非常流行和方便。 您可以在eclipse中创建一个新项目,从其他项目导入 - 导出代码到项目中,也可以为您执行版本控制等。不需要编写make文件,eclipse会根据您在GUI中提到的首选项为您执行此操作。 如果您参与了C ++项目,只需在eclipse上安装CDT插件即可完成。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.