Makefile——多个目标,自动依赖

Makefile - multiple targets, automatic dependecies

本文关键字:依赖 目标 Makefile      更新时间:2023-10-16

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

现在我的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)你可以这样使用:

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