Makefile - 多个目标,自动依赖

时间:2014-07-12 09:33:13

标签: c++ makefile

我正在开发一个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
  1. 我的一些课程使用外部库。例如,要编译Encryption.cpp,我需要将-lssl添加到目标。有没有办法让我的makefile知道它?现在我必须在我使用Encryption.o
  2. 的地方添加-lssl
  3. 我有点厌倦了查看我的每个目标使用哪些对象并在makefile中编写它们。有没有办法让编译器找到所有必需的.o并自动编译它们?
  4. 我想将已编译的文件存储在Bin /目录中,并避免每次运行make时重新编译它们。
  5. 现在我的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
    

1 个答案:

答案 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已经可以做到了。