C库,makefile头依赖项

时间:2017-04-05 03:08:57

标签: c makefile compiler-errors shared-libraries static-libraries

让'说我有几个文件夹的图书馆项目:

  • build:.o文件去哪里
  • lib:编译的静态和动态库的位置
  • src:.c源文件的位置
  • 包括:标题放置位置

问题是,每当我更改一个头文件并且没有意识到这一点时(这很明显,如果你看看我的Makefile),并说一切都是最新的。我已经设法用另一个不是库的项目来解决这个问题,但每当我尝试一些这个项目时,我会在目标构建时出现错误。这是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

2 个答案:

答案 0 :(得分:1)

我能够自己解决这个问题。改变了这个:

build/%.o: src/%.c
    $(CC) $(CFLAGS) -o $@ -c $<

对此:

build/%.o: src/%.c
    $(CC) $(CFLAGS) -MMD -o $@ -c $<

include $(DEPS)

$(DEPS): ;

并补充道:

DEPS=$(patsubst %.o,%.d,$(OBJECTS))

后:

OBJECTS=$(patsubst src/%.c,build/%.o,$(SOURCES))

答案 1 :(得分:0)

生成标题列表:

%*f%

由于您没有任何依赖项文件,只需确保所有目标文件都依赖于所有头文件:

HEADERS := $(wildcard src/*.h)

如果修改了任何标头,则每个目标文件都会重建,因为任何源文件都可能包含(并依赖)任何头文件。

如果您不想在更改标头后重建所有内容,则可以手动添加特定的依赖项,以便仅重建所需的文件。例如:

$(OBJECTS): $(HEADERS)

这些依赖关系也可以自动生成。