c++ - 仅当标头/源更改时,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。
解决方案
推荐阅读
- node.js - 从本地部署到 Heroku,然后从 Github 切换到 Heroku
- maven - 如何让 Artifactory 使用最新的(而不是最旧的)快照工件?
- python - 如果它们是 str/text 格式,如何比较 2 个日期时间值?
- laravel-blade - Laravel 后备视图
- c# - 生成签名包/APK 不包含插件
- angular - 根据选择值禁用 Angular Reactive 表单输入
- typescript - 受保护路由的 jest.mock express-jwt 中间件行为
- javascript - Vue - 动态导入 Vue 组件
- azure-active-directory - 带有确认屏幕的 Azure AD B2C 重置密码自定义策略
- angular - 通过 IFrame (Angular 5) 显示内容部分