我正在开发一个C ++的大项目。 它由几个目标可执行文件组成,但大多数都使用公共类。 我的工作目录是这样的:
.
..
Classes/
File.h
File.cpp
Encryption.h
Encryption.cpp
Database.h
Database.cpp
Bin/ (I want my objects to be compiled there)
FirstProgram.cpp
SecondProgram.coo
ThirdProgram.cpp
Makefile
现在我的makefile看起来像:
CXX=g++
FLAGS=-g -Wall -std=c++11
CLASSES=./Classes
Bin/%.o: %.cpp
$(CXX) $(FLAGS) -c -o $@ $<
Bin/%.o: $(CLASSES)/%.cpp
$(CXX) $(FLAGS) -c -o $@ $<
FirstProgram: Bin/File.o Bin/Encryption.o Bin/Database.o
$(CXX) $(FLAGS) -o Bin/$@ $^ -lssl `mysql_config --cflags --libs`
SecondProgram: ... Bin/... Bin/...
$(CXX) $(FLAGS) -o Bin/$@ $^ ??? additional libs there
答案 0 :(得分:0)
For 1)你可以使用这样的东西:
CRYPT_TARGETS := FirstProgram ThirdProgram
$(CRYPT_TARGETS): LDLIBS += -lssl
$(CRYPT_TARGETS): Bin/Encryption.o
Bin/FirstProgram: Bin/File.o Bin/Database.o
$(CXX) $(FLAGS) -o $@ $^ $(LDLIBS) `mysql_config --cflags --libs`
Bin/ThirdProgram: Bin/Astronomy.o Bin/KitchenSink.o
$(CXX) $(FLAGS) -o $@ $^ $(LDLIBS) `mysql_config --cflags --libs`
(注意我是如何更改目标名称的;如果规则用于构建文件,则目标应该是文件的确切名称。)
我认为2)不是一个好主意。在编辑代码时,您应该知道在二进制文件中添加和删除的组件,因此不需要额外的工作。并且Make无法知道需要一个不存在的对象 ,除非你对自己强加了不属于该语言的命名约定(如果你喜欢这个想法,请告诉我们)我们会告诉你如何)。然后有main
个冲突......如果对象列表变长,重叠很多,也许你应该构建库。
3)是一个好主意,看起来你的makefile已经可以做到了。