我正在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发布于 2014-07-12 09:58:33
对于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`(请注意我是如何更改目标名称的;如果规则的目的是构建文件,则目标应该是文件的确切名称。)
我不认为那是个好主意。在编辑代码时,您应该知道从二进制文件中添加和删除哪些组件,所以这并不是什么额外的工作。而且,Make不可能知道不存在的对象是必需的,除非您将命名约定强加给自己,而这些约定不是语言的一部分(如果您喜欢这个想法,请告诉我们,我们将向您展示如何)。然后是main冲突..。如果对象的列表越来越长,并且重叠很多,那么也许您应该构建库。
( 3)是个好主意,看起来你的makefile已经可以做到了。
https://stackoverflow.com/questions/24711603
复制相似问题