我认为我的 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/