我有三个 c 文件及其头文件:
- 主/程序。{c,h}
- lib/lib1.{c,h}
- lib/lib2.{c,h}
program
依赖于 lib1.o
,而 lib1.o
又依赖于 lib2.o
。 program
不直接依赖于lib2.o
。
program.main()
调用 lib1.func1()
,后者又调用 lib2.func2()
。
我有两个 Makefile
;一个在主文件夹中,另一个在 lib 中。
lib/Makefile:
all: lib1.o lib2.o
lib1.o: lib2.o lib2.h lib1.h
lib2.o: lib2.h
主文件/Makefile:
VPATH=../lib
all: program
program: program.o lib1.o lib1.h
$(CC) $(CFLAGS) -o $@ $^
当我运行 make -C main all
时,出现 undefined reference to 'func2'
错误。两个 lib
目标文件都编译得很好。
我是否需要使 lib2
成为 program
的依赖项,即使它不直接调用它?
最佳答案
是的。 lib1.o 包含对仅存在于 lib2.o 中的函数的引用。如果您不告诉 main 的链接器也链接到 lib2.o,它将永远找不到它。编译器在编译时不会解析从 lib1 到 lib2 的引用,它只是检查 header 以确保它被正确调用。
您可以让 lib 目录 Makefile 构建一个包含两个 .o 文件的 .a (man ar),然后链接到主构建中的 .a 文件。
关于c - Makefile 目标需要其他目标的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38077137/