Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C库,makefile头依赖项_C_Makefile_Compiler Errors_Shared Libraries_Static Libraries - Fatal编程技术网

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源文件的位置
  • 包括:放置标题的位置
问题是,每次我更改一个头文件,make都没有意识到这一点(如果你查看我的Makefile,这是很明显的原因),并说所有内容都是最新的。我已经设法用另一个不是库的项目解决了这个问题,但是每次我尝试一些东西时,在构建目标时,我都会遇到一个错误。以下是生成文件:

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))