C库,makefile头依赖项
假设我有一个带有几个文件夹的库项目:C库,makefile头依赖项,c,makefile,compiler-errors,shared-libraries,static-libraries,C,Makefile,Compiler Errors,Shared Libraries,Static Libraries,假设我有一个带有几个文件夹的库项目: 生成:文件的存放位置 lib:编译的静态和动态库的位置 src:c源文件的位置 包括:放置标题的位置 问题是,每次我更改一个头文件,make都没有意识到这一点(如果你查看我的Makefile,这是很明显的原因),并说所有内容都是最新的。我已经设法用另一个不是库的项目解决了这个问题,但是每次我尝试一些东西时,在构建目标时,我都会遇到一个错误。以下是生成文件: CC=gcc CFLAGS=-g -O2 -Wall -Iinclude -rdynamic -D
- 生成:文件的存放位置
- lib:编译的静态和动态库的位置
- src:c源文件的位置
- 包括:放置标题的位置
CC=gcc
CFLAGS=-g -O2 -Wall -Iinclude -rdynamic -DNDEBUG $(OPTFLAGS)
LDFLAGS=$(OPTLIBS)
SOURCES=$(wildcard src/*.c)
OBJECTS=$(patsubst src/%.c,build/%.o,$(SOURCES))
TARGET=lib/libdatastruct.a
SO_TARGET=$(patsubst %.a,%.so,$(TARGET))
# The Target lib
all: $(TARGET) $(SO_TARGET)
dev: CFLAGS=-g -Wall -Iinclude -Wall -Wextra $(OPTFLAGS)
dev: all
$(TARGET): CFLAGS += -fPIC
$(TARGET): build $(OBJECTS)
ar rcs $@ $(OBJECTS)
ranlib $@
$(SO_TARGET): $(TARGET) $(OBJECTS)
$(CC) -shared -o $@ $(OBJECTS)
build/%.o: src/%.c
$(CC) $(CFLAGS) -o $@ -c $<
build:
@mkdir -p lib
@mkdir -p build
clean:
rm -rf lib build
CC=gcc
CFLAGS=-g-O2-Wall-Iinclude-rdynamic-DNDEBUG$(OPTFLAGS)
LDFLAGS=$(OPTLIBS)
SOURCES=$(通配符src/*.c)
OBJECTS=$(patsubst src/%.c,build/%.o,$(SOURCES))
TARGET=lib/libdatastruct.a
SO_TARGET=$(patsubst%.a,%.SO,$(TARGET))
#目标库
全部:$(目标)$(SO_目标)
dev:CFLAGS=-g-Wall-Iinclude-Wall-Wextra$(OPTFLAGS)
戴夫:好的
$(目标):CFLAGS+=-fPIC
$(目标):生成$(对象)
ar rcs$@$(对象)
兰利布$@
$(SO_目标):$(目标)$(对象)
$(CC)-共享-o$@$(对象)
build/%.o:src/%.c
$(CC)$(CFLAGS)-o$@-c$<
建造:
@mkdir-p库
@mkdir-p构建
清洁:
rm-rf库构建
生成标题列表:
HEADERS := $(wildcard src/*.h)
由于没有任何依赖项文件,只需确保所有对象文件都依赖于所有头文件:
$(OBJECTS): $(HEADERS)
如果修改了任何头文件,则会重新生成每个对象文件,因为任何源文件都可能包含(并依赖)任何头文件
如果不希望在更改标头后重建所有内容,可以手动添加特定的依赖项,以便只重建所需的文件。例如:
src/file.c: src/file.h
src/main.c: src/main.h src/file.h
这些依赖关系也可以自动生成。我自己就能够解决这个问题。更改为:
build/%.o: src/%.c
$(CC) $(CFLAGS) -o $@ -c $<
之后:
OBJECTS=$(patsubst src/%.c,build/%.o,$(SOURCES))
这是唯一的办法吗?因为它有一个修改过的头文件,只包含在一个文件中,所以整个项目都必须重建。@cpassos没有任何附加假设,是的。任何源文件都可以包含任何头文件,并且没有关于这些头文件的信息可供使用。@cpassos如果您不想重建所有内容,您可以手动或以编程方式创建特定的依赖项。太好了!其他类似的帖子解释了如何创建自动依赖关系,有没有帮助你解决这个问题?@2501这很有帮助。虽然我不太明白它为什么会起作用。是否为每个.o目标创建两个食谱?因为我用
build/%.o:src/%.c
和$(DEPS)
包含的行是相同的形式,但用实际文件名替换了百分比符号。这在makefile中是正常的吗?我实际上是指规则,而不是食谱。如果我为一个目标创建多个规则,并且只在其中一个目标上放置一个配方,而让其他目标为空,只包含依赖项,那么我将始终确保目标是最新的依赖项?我不确定,我还没有看到整个makefile。我建议你做一些研究和/或问一些新问题。我问,我只是好奇,你是否从我的回答中了解到自动依赖项生成的存在?@2501我已经知道并尝试了许多方法,我只是不明白我必须提供一个一般规则(带有百分号),即使我包含了gcc生成的依赖项文件。无论如何,谢谢你。
DEPS=$(patsubst %.o,%.d,$(OBJECTS))
OBJECTS=$(patsubst src/%.c,build/%.o,$(SOURCES))