#include<stdio.h>
void print_hello(void);
int factorial(int n);
#include<stdio.h>
#include<functions.h>
int main()
{
print_hello();
printf("\nThe factorial is: %d \n",factorial(5));
return 0;
}
#include<stdio.h>
#include<functions.h>
void print_hello()
{
printf("\nHello World!\n");
}
#include<stdio.h>
#include<functions.h>
int factorial(int n)
{
if(n!=1)
{
return(n*factorial(n-1));
}
else
return 1;
}
exec : \
compile
echo "Executing the object file"
./compile
compile : main.o hello.o factorial.o
echo "Compiling"
gcc -o compile $^
main.o : main.c functions.h
gcc -c main.c -I./INCLUDE -I./SRC
hello.o : hello.c functions.h
gcc -c hello.c -I./INCLUDE -I./SRC
factorial.o : factorial.c functions.h
gcc -c factorial.c -I./INCLUDE -I./SRC
文件夹:make_example \ INCLUDE \ functions.h文件夹: make_example \ SRC \ main.c文件夹:make_example \ SRC \ hello.c文件夹: make_example \ SRC \ factorial.c文件夹:make_example \ makefile
将make文件编译为“desktop:〜/ make_example $ make
时出错 make: * 没有规则可以制作目标main.c', needed by
main.o'。停止“。
请帮我理解为什么会出现这个错误
答案 0 :(得分:8)
当你运行make
时,它会尝试在文件中创建第一个目标(exec
),这取决于compile
,这取决于main.o
,这取决于main.c
。没有文件main.c
,只有SRC/main.c
。没有规则可以创建名为main.c
的文件,并且没有预先存在的main.c
,因此make
有错误并退出。
You can fix this与VPATH
或vpath
:
VPATH = SRC INCLUDE
答案 1 :(得分:3)
你的main.c在子目录src中,并且make不知道在那里看。有很多选项,最简单的方法是在makefile中编写“src / main.c”而不是“main.c”。你也可以将main.c移动到一个级别,或者将makefile移动到src /并在那里构建,或者将一个makefile放入cds到src的toplevel中并调用make(这是递归make,很多人认为是“有害的”,但在很多(大多数)情况下完全没问题。)你也可以使用VPATH指令,但是如果你选择这样做,请注意这不适用于所有版本的make。