如何从对象文件制作一个makefile

时间:2015-11-26 08:02:20

标签: c makefile linker

我正在试图弄清楚如何创建一个makefile来创建目标文件然后将它们编译成可执行文件但是当我尝试创建一个使用在另一个文件中声明的变量的目标文件时它不会编译到目标文件。换句话说,如果我有一个具有全局变量var的main.c,并且我有另一个名为other.c的文件,它使用var但不像main.c那样声明它。有没有办法将它们编译到目标文件并链接它们,以便other.c在main.c中看到var的声明?我有这种印象,但我无法理解,因为当我做gcc -c other.c我得到一个关于var的错误。 (我知道你可以使用var extern来修复这个问题,但是我需要能够做到这一点而不这样做)

以下是我收到的错误消息。

   foundations.c: In function ‘FoundationC’:
   foundations.c:2:2: error: ‘DAYS’ undeclared (first use in this function)
  DAYS=DAYS+10;
  ^
  foundations.c:2:2: note: each undeclared identifier is reported only once  for each function it appears in
foundations.c:3:2: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
  printf("The FoundationC Contractor completed the project - DAY %d\n",DAYS );fflush(stdout);
  ^
foundations.c:3:85: error: ‘stdout’ undeclared (first use in this function)
  printf("The FoundationC Contractor completed the project - DAY %d\n",DAYS );fflush(stdout);

所以DAYS是在main.c而不是foundations.c中声明的变量。

编辑:已解决我将所需的stl头文件和全局变量添加到另一个文件,然后它能够​​编译为目标文件。抱歉,这个问题。我认为对象文件链接有能力使这不必要,但我猜不是。

1 个答案:

答案 0 :(得分:1)

  

...但是当我尝试创建一个使用在另一个文件中声明的变量的目标文件时,它不会编译到目标文件。

这与makefile无关。 makefile中的命令将例如在.c文件上启动编译器以生成目标文件。这个编译成功了,或者在这种情况下编译器没有给你一个或多个错误消息。

您描述的另一个.c文件中声明的变量的问题不会停止编译器;它只会编译.c文件,并且最多会发出一个警告消息,表明没有声明变量。但它会产生一个目标文件。

在链接时,必须为链接器提供所有生成的目标文件(makefile中的命令使用命令行上的名称列表启动链接器),然后生成可执行文件。如果现在无法在目标文件中找到变量,则链接过程将失败,并且不会生成可执行文件。但是所有目标文件都已生成(如果编译步骤中没有错误)。

也许他有助于重新制定你的问题。