0

好的,我假设这是一个简单的问题。我有一个 .c 文件和一个 Makefile。如果这很重要,我正在使用 Linux 12.10 ubuntu。我试图了解我如何在终端中编写以获取这两个文件以在这两个文件使用 make 的目录中创建可执行文件、源文件和目标文件。我已经安装了 nasm,但不确定是否需要安装其他东西。这就是我目前正在做的事情,但似乎无法理解我在 Windows 中可以做的事情背后的基础知识,但似乎无法让它在 linux 中工作。我已将 Makefile 更改为除了 linux。

我知道这可能非常简单,但我对 linux 还很陌生,我并不真正理解一些我认为我应该能够很容易地弄清楚的事情,所以如果这看起来很容易,我深表歉意。

$ make firstlab.c firstlab

是我进入正确目录后在终端中输入的内容。我的反馈是“

make: Nothing to be done for `homework1.c'.
gcc     homework1.c   -o homework1
homework1.c: In function ‘main’:
homework1.c:20:5: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
homework1.c:21:5: warning: incompatible implicit declaration of built-in function ‘scanf’ [enabled by default]

"

#include <stdlib.h>
#include <stdio.h>



int main (int argc, char* argv[])
{

int firstNumber = 0;
int secondNumber = 0;
int result = 0;

printf("Enter first value: ");
scanf("%d", &firstNumber);
printf("Enter second value: ");
scanf("%d", &secondNumber);

if(firstNumber >= secondNumber)
    result = firstNumber - secondNumber;
else if(secondNumber > firstNumber)
     result = secondNumber + firstNumber;

printf("Result: %d\n", result);



system("pause");
return result;
}

制作文件:

##########H
PROJECT = Homework1
##################

CC   = gcc

# win 32
#RM = del

#linux
RM = rm -f

BIN  = $(PROJECT).exe
OBJ  = $(PROJECT).o  


all:    $(BIN)

clean:
${RM} $(OBJ) $(BIN) $(PROJECT).s

$(BIN): $(OBJ)
$(CC) $(OBJ) -o $(PROJECT).exe 

$(OBJ): $(PROJECT).s
$(CC) -c $(PROJECT).s -o $(PROJECT).o 

$(PROJECT).s: $(PROJECT).c
$(CC) -c $(PROJECT).c -S  -masm=intel 

任何帮助表示赞赏。

4

1 回答 1

0

你确定你有一个makefile吗?您显示的输出似乎与该假设不符。

make firstlab.c firstlab有点奇怪。您可以将其替换为make firstlab,它会产生相同的结果。如果你想要一个目标文件类型,make firstlab.o.

所有这些行为都取决于make的隐含规则。您可能应该为您的项目编写一个生成文件以更好地控制行为。为了支持创建程序集文件 ( firstlab.s),无论如何您都必须这样做。类似的规则:

%.s : %.c
   $(CC) $(CFLAGS) -S -o $@ $<

应该这样做。您可以为可执行文件和目标文件制定类似的规则。我强烈建议您快速浏览一下GNU Make Manual以开始使用。

要修复printfscanf警告,#include <stdio.h>请在程序顶部添加。

于 2013-01-29T21:31:43.173 回答