【发布时间】:2021-06-05 21:03:30
【问题描述】:
问题
我正在用 c 编写一个 B-tree,它变得非常大。我有一个用于树的结构,一个用于节点,一个用于项目(键/值)。我想使用 make 将所有三个头文件中的目标文件编译到存档 (.a) 中。每当我尝试使用 make 进行编译时,它都会使用存档而不是每次都构建对象。知道为什么吗?
include/
btree.h
item.h
node.h
src/
btree_attach.c
btree_create.c
btree_destructor.c
btree_disk.c
btree_find.c
btree_get_node.c
btree_insert.c
btree_key_size.c
item_compare_item.c
item_compare_item_qsort.c
item_print_item.c
node_create_.c
node_destructor.c
node_find.c
node_flush_node.c
node_insert.c
node_print_node.c
node_split_node.c
# Generic makefile
# VAriables:
src := $(wildcard *.c)
obj := $(obj:.c=.o)
dep := $(dep:.o=.d)
CFLAGS := -g
INCLUDE = -Iinclude
all: lib/btree.a\
clean:
rm -f a.out obj/* bin/*
# ---------------
# Object files
$(obj): $(src) $(dep)
$(CC) $(CFLAGS) $(INCLUDE) $@ $^
#Archive file
.PHONY: lib/btree.a
lib/btree.a: $(obj) $(dep)
ar -rv $@ $^
更新
我将 make 文件更改为以下内容:
# VAriables:
src := $(wildcard src/*.c)
obj := $(src:.c=.o)
dep := $(obj:.o=.d)
CFLAGS := -g
INCLUDE = -include
print:
$(src)\
$(obj)\
$(dep)
all: lib/btree.a
# ---------------
# Object files
$(obj): $(src)
$(CC) $(CFLAGS) $(INCLUDE) $@ $^
#Archive file
lib/btree.a: $(obj)
ar -rv $@ $^
打印输出有以下内容
src/b_util.c src/item_compare_item.c src/b_tree.c src/item_print_item.c src/random_tester_2.c src/node_attach.c src/node_find.c src/node_create_.c src/btree_disk.c src/node_insert.c src/tnode.c src/btree_create.c src/node_unattach.c src/b_tree_test.c src/node_split_node.c src/node_print_node.c src/random_tester_1.c src/node_destructor.c src/btree_insert.c src/item.c src/btree_attach.c src/item_compare_item_qsort.c src/node_flush_node.c src/jdisk.c src/btree_find.c src/btree_destructor.c src/btree_get_node.c src/jdisk_test.c src/btree_key_size.c\
src/b_util.o src/item_compare_item.o src/b_tree.o src/item_print_item.o src/random_tester_2.o src/node_attach.o src/node_find.o src/node_create_.o src/btree_disk.o src/node_insert.o src/tnode.o src/btree_create.o src/node_unattach.o src/b_tree_test.o src/node_split_node.o src/node_print_node.o src/random_tester_1.o src/node_destructor.o src/btree_insert.o src/item.o src/btree_attach.o src/item_compare_item_qsort.o src/node_flush_node.o src/jdisk.o src/btree_find.o src/btree_destructor.o src/btree_get_node.o src/jdisk_test.o src/btree_key_size.o\
src/b_util.d src/item_compare_item.d src/b_tree.d src/item_print_item.d src/random_tester_2.d src/node_attach.d src/node_find.d src/node_create_.d src/btree_disk.d src/node_insert.d src/tnode.d src/btree_create.d src/node_unattach.d src/b_tree_test.d src/node_split_node.d src/node_print_node.d src/random_tester_1.d src/node_destructor.d src/btree_insert.d src/item.d src/btree_attach.d src/item_compare_item_qsort.d src/node_flush_node.d src/jdisk.d src/btree_find.d src/btree_destructor.d src/btree_get_node.d src/jdisk_test.d src/btree_key_size.d
基本上它们都进入了 src 目录,但我希望将它们分开(见下文)。为什么要把所有东西都放在 src 中?
obj/*.o
dep/*.d
src/*.c
【问题讨论】:
-
lib/btree.a不是虚假目标,因为您实际创建了它。 -
至于你的问题,你有没有修改任何用于静态库的文件?请尝试为您的
Makefile创建一个minimal reproducible example,您显示的那个包含错误。