我有三个c文件及其头文件:
主程序/程序。{c,h}
lib / lib1。{c,h}
lib / lib2。{c,h}program
取决于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的引用,它只是检查标头以确保正确调用了它。
您可以在lib目录Makefile中构建一个同时包含两个.o文件的.a(man ar),然后从您的主版本中链接该.a文件。
关于c - Makefile目标需要其他目标的依赖性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38077137/