c++ - Makefile 不检查头文件中的更新

标签 c++ makefile compilation header-files

我认为我的 makefile 非常好,但后来我尝试只更新一个头文件并重新编译我的库,但它并没有改变任何东西。
我怎样才能使它工作并重新编译 h 文件中的代码。
我的生成文件:

SHELL = /bin/sh
SOURCE_FILES_DIRS = -I./../frmwrk/ -I./../Utils/
CXX = g++
CXXFLAGS = $(SOURCE_FILES_DIRS) -std=c++17 -rdynamic -fPIC -g -Wall
LDFLAGS = -shared

LIBS_DIR = ../../libs/
LIB_NAME = libIni.so
TARGET  = $(LIBS_DIR)$(LIB_NAME)
SOURCES = $(shell echo *.cpp)
HEADERS = $(shell echo *.h)
OBJECTS = $(SOURCES:.cpp=.o)
LINK_LIBS = -lFrmwrk -lUtils

PREFIX = $(DESTDIR)/usr/local
BINDIR = $(PREFIX)/bin

all: $(TARGET)

$(TARGET): $(OBJECTS) $(HEADERS)
    $(CXX) $(CXXFLAGS) -L$(LIBS_DIR) $(LDFLAGS) -o $(TARGET) $(OBJECTS) $(HEADERS) $(LINK_LIBS)

clean:
    rm -f *.o $(TARGET)/*.so
    rm -rf $(TARGET)

最佳答案

$(TARGET): $(OBJECTS) $(HEADERS)
   [relink command]
这仅在更改头文件时强制重新链接。 make无论如何都不知道哪个 C++ 源文件包含哪个头文件。 make只知道在头文件中显式声明的依赖项。这里提到的唯一依赖是 $(TARGET) ,可执行文件,依赖于头文件。
为了强制,例如main.o declarations.h 时重新编译包括在内,因为 main.cpp #includes declarations.h ,你必须明确:
main.o: declarations.h
这指示make重建main.o , 来自 main.cpp , 每当 declarations.h改变,这就是你想要的。
手动跟踪由于对哪些头文件的更改无法扩展而需要重建哪些对象模块。 make ,当然,对任何与 C++ 相关的知识一无所知,因此您必须手动跟踪所有依赖项,但这又无法扩展。
这里的解决方案是迁移到一些更高级别的构建工具,例如 GNU autoconf 和 automake,它们将编写 Makefile为您完成一系列规则,这些规则使用编译器标志转储依赖项,并为您自动更新规则。您始终可以使用相同的编译器标志(有标志,并自己构建所有脚手架,无需 autoconf 和 automake。但是,当 autoconf automake 会为您完成时,何必麻烦呢?

关于c++ - Makefile 不检查头文件中的更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63495250/

相关文章:

c++ - Iaccessible接口(interface)的accLoacation()方法中的参数如何初始化?

c++ - 在类模板中为成员函数定义单个模板,并在成员函数中使用两个模板

c++ - boost multi_index_container 持久化存储在文件中

c++ - 为多次执行创建makefile

c++ - 在 mac 上编译 STASM

compilation - 如何动态链接你的 nim 应用程序和 musl?

compiler-errors - 在环境变量CC(MPI,Intel编译器,包装器)中找不到编译器集

c++ - 如何在 GNUMakefile 中包含 libxml2 库

linux - 通过 gcc Makefile 的两个可执行文件

java - Android Studio构建失败,出现异常任务':app:dexDebug'的执行失败