首页 > 解决方案 > 仅当标头/源更改时,Make 才应重新编译。可能的?

问题描述

我使用 Ubuntu Linux 和 g++ 作为编译器/链接器。

源位于“./src”

标头位于“./include”

如果(且仅当)相应的 CPP 源文件或头文件已更改,我想重新编译给定的 *.o 文件。当然,除非我运行“make clean”,否则它应该重新编译所有内容。我该怎么做呢?

以下是我的makefile的相关部分:

NAME                = ext

INI_DIR             =   /etc/php/7.4/cli/conf.d

EXTENSION_DIR       =   $(shell php-config --extension-dir)
DIST_DIR        =   ./dist

EXTENSION           =   dist/${NAME}.so
INI                 =   ${NAME}.ini

COMPILER            =   g++
LINKER              =   g++

SOURCES             =   $(wildcard src/*.cpp)
OBJECTS             =   $(SOURCES:%.cpp=%.o)


all:                    ${OBJECTS} ${EXTENSION}

${EXTENSION}:           ${OBJECTS}
                        ${LINKER} ${LINKER_FLAGS} -o $@ ${OBJECTS} ${LINKER_DEPENDENCIES}

${OBJECTS}:
                        ${COMPILER} ${COMPILER_FLAGS} $@ ${@:%.o=%.cpp}

install:        
                        ${CP} ${EXTENSION} ${EXTENSION_DIR}
                        ${CP} ${INI} ${INI_DIR}

dist:       
                        ${CP} ${EXTENSION} ${DIST_DIR}
                
clean:
                        ${RM} ${EXTENSION} ${OBJECTS}

编辑:

我将此添加到makefile

DEPS                =   $(wildcard $(OBJECTS:%.o=%.d))
    
include $(DEPS)

....

clean:
                        ${RM} ${EXTENSION} ${OBJECTS} ${DEPS}

我将 -MM 添加到编译器标志。

现在编译器命令如下所示:

g++ -MM -Wall -I/some/path/lib -I/other/path/lib2 -c -O2 -std=c++17 -fpic -o src/islide_collection.o src/islide_collection.cpp

现在这会创建依赖文件,但 *.o 文件都是空的,因此链接器会返回错误。

怎么了?

顺便说一句:这不仅仅是关于头文件的更改。我想在修改 x.cpp 或 xh 时重新编译 xo。

标签: c++makefilegnu-make

解决方案


推荐阅读