【问题标题】:Is it a header file or library? in a makefile它是头文件还是库?在生成文件中
【发布时间】:2010-06-02 11:55:08
【问题描述】:

我已经知道头文件和库之间的区别。但是,当我编写我的 makefile 时,我在决定是否应该将某些内容作为文件的依赖项还是仅放在链接规则中时遇到一些困难。

例如:我有 2 个简单的文件: main.c:

#include <stdio.h>
main(){
  printf("this is the sine or 90");
  sinus(90);
}

和func.c:

#include <math.h>
sinus(int num){
  return sin(num);
}

我的 makefile 是:

main:   main.o  func.o
    gcc main.o func.o -lm -o main

func.o: func.c
main.o: main.c

好吧,我的问题是为什么这个 makefile 有效而这个无效:

main:   main.o  func.o
    gcc main.o func.o -lm -o main

func.o: func.c math.h
main.o: main.c

【问题讨论】:

    标签: c makefile header


    【解决方案1】:

    您不需要使 func.o 依赖于 math.h,因为该文件不太可能更改。

    关于你得到的错误是因为你没有明确指定make应该如何编译文件,所以它试图推断如何编译它,它只在简单的情况下有效。我不确定 make 究竟是如何做到的,但我认为它只是做到了gcc -o target.o -c &lt;your deps&gt;

    【讨论】:

      【解决方案2】:

      因为make在当前目录中寻找一个文件“math.h”并试图做cc func.c math.h来产生func.o

      【讨论】:

      • 不完全正确。它试图找到产生 math.h 的规则。由于不存在依赖项将失败。
      【解决方案3】:

      问题是您并不确切知道使用隐式规则后如何解决 Makefile - 肯定有一个会导致您遇到问题。 (也许尝试编译 math.h,或者 math.h 没有找到等等。(你没有发布你的错误,所以我们只能推测)。

      我建议您通过使用“-r”调用 make 来禁用隐式规则并明确执行所有操作 - 这样您将了解更多,因为您将了解 makefile 的工作原理,而不是知道如何编写在某些情况下有效的 makefile .

      更多关于隐式规则:Make documentation - Implicit rules

      更多关于制作Make documentation

      【讨论】:

        猜你喜欢
        • 2011-08-09
        • 2015-12-08
        • 1970-01-01
        • 2012-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多