如何使用 Make 将目标文件编译为存档

用户11145590

问题

我正在用 c 编写一个 B 树,它变得非常大。我有一个用于树的结构,一个用于节点,一个用于项目(键/值)。我想使用 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
疯狂的科学家

很可能是因为您的 sources 变量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) $@ $^

是完全错误的。这表示“每个目标文件都依赖于所有源文件和所有依赖文件”,以及“要构建单个目标文件,您需要编译所有源文件”。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Make 尝试将目标编译为文件

如何使用VS编译器将预处理后的文件编译为目标文件

如何使用Jython将.pyc文件反编译为.py

如何将feather-icons编译为css文件?

如何将 .ts 文件集编译为单个 .js

我如何准确地将Java编译为JAR文件?

如何将javascript文件编译为一个?

如何将 C++ 编译为多个文件?

如何将Kivy和Python文件编译为APK

使用cl.exe将asm文件编译为dll

使用makefile进行编译时,如何在不使用命令“ make clean”的情况下清除目标文件?

如何编译为目标的Java 1.0

如何使用 G++ 将文本文件编译为 exe 文件

如何使用库导入将C文件编译为Webassembly文件(Emscripten)

如何使用Babel将所有包含的文件编译为一个文件?

如何使用Gulp将多个打字稿文件编译为一个javascript文件?

如何使用IntelliJ Idea 13 Ultimate文件观察器将scss文件编译为css?

如何使用pyinstaller将多个子进程python文件编译为单个.exe文件

如何将.NET Core 2.1 API项目编译为目标.NET Framework 4.7

如何使用 webpack 和 babel 将 js 文件编译为库

如何使用npm脚本将Typescript编译为javascript然后转换为1个文件

如何使用ICSharpCode.Decompiler将整个程序集反编译为文本文件?

如何使用nanopb和protobuf将nanopb .proto文件编译为.h和.c文件(`protoc`编译问题)

如何使用Make以相同的方式编译多种文件类型

如何使用make文件在Xcode中编译项目

我无法使用webpack将已编译的CSS编译为单个CSS文件

将脚本编译为可执行文件时,如何实现到外部使用文件的文件路径?

如何使用Webpack 4将sass编译为CSS?

如何使用Cython将Python 3编译为C