我有三个c文件及其头文件:


主程序/程序。{c,h}
lib / lib1。{c,h}
lib / lib2。{c,h}


program取决于lib1.o,后者取决于lib2.oprogram不直接依赖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/

10-11 22:11