c - Makefile 目标需要其他目标的依赖关系

标签 c makefile linker

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

  1. 主/程序。{c,h}
  2. lib/lib1.{c,h}
  3. lib/lib2.{c,h}

program 依赖于 lib1.o,而 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 的引用,它只是检查 header 以确保它被正确调用。

您可以让 lib 目录 Makefile 构建一个包含两个 .o 文件的 .a (man ar),然后链接到主构建中的 .a 文件。

关于c - Makefile 目标需要其他目标的依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38077137/

相关文章:

c - 利用二分查找算法

c - 在不使用乘法的情况下获取数字的阶乘

c - gcc 命令中的 .o 文件有什么作用?

c++ - LNK2019 unresolved external symbol...再次

c - 为什么我们应该在函数声明的同一个文件中包含函数原型(prototype)的头文件?

c - 用罗马数字表示年份

c - 用于上下文切换的 gcc 内联汇编

c - 在 makefile 中使用 'Empty Target'

compiler-errors - cmake/make - 无法识别的命令行选项 "-std=c++14"- 但 G++ 可以

c++ - 链接 boost 日志时出现链接器错误(对 boost::log::v2_mt_posix::sinks 的 undefined reference )