【问题标题】:How to Compile Object files into an Archive using Make如何使用 Make 将目标文件编译到存档中
【发布时间】: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,您显示的那个包含错误。

标签: c makefile


【解决方案1】:

很可能是因为您的源变量src 为空。这意味着您的对象列表变量 obj 为空。这意味着您的库 lib/btree.a 不依赖任何东西,因此 make 不会构建任何东西。

这很可能是因为:

src := $(wildcard *.c)
obj := $(obj:.c=.o)
dep := $(dep:.o=.d)

应该是:

src := $(wildcard src/*.c)
obj := $(src:.c=.o)
dep := $(obj:.o=.d)

如果您向我们展示您的 makefile 在哪里以及您从哪个目录调用 make 会更清楚。

您还有很多其他问题;例如这个:

$(obj): $(src) $(dep)
        $(CC) $(CFLAGS) $(INCLUDE) $@ $^

大错特错。这表示“每个目标文件都依赖于所有源文件和所有依赖文件”,并且“要构建单个目标文件,您需要编译所有源文件”。

【讨论】:

  • 是的,这也是错误的。但是,正如问题所暗示的那样,如果来源位于src 中,则 src 将不包含任何内容。而dep 是错误的。更新了答案。谢谢指针。
猜你喜欢
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多