Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux上带有多个*.c文件的GCC makefile_C_Gcc_Makefile - Fatal编程技术网

Linux上带有多个*.c文件的GCC makefile

Linux上带有多个*.c文件的GCC makefile,c,gcc,makefile,C,Gcc,Makefile,我需要为这些文件创建一个MakeFile: main.c 凯瑟c 凯瑟 我试过这个: all: task1 task1 : main.o ceaser.o gcc main.o ceaser.o task1.o -o task1 ceaser.o : ceaser.c ceaser.h gcc -c -g -Wall ceaser.c main.o : main.c gcc -c -g -Wall main.c clean: rm *.o cleanall: rm task1 *.o 但当

我需要为这些文件创建一个MakeFile:

  • main.c
  • 凯瑟c
  • 凯瑟
  • 我试过这个:

    all: task1
    task1 : main.o ceaser.o gcc main.o ceaser.o task1.o -o task1
    ceaser.o : ceaser.c ceaser.h gcc -c -g -Wall ceaser.c
    main.o : main.c gcc -c -g -Wall main.c 
    clean: rm *.o 
    cleanall: rm task1 *.o
    
    但当我试图运行它时,它只是说:

    make: Nothing to be done for `MakeFile1'.
    

    要使其成为一个合适的makefile,格式设置至关重要,否则根本无法工作

    all: task1
    
    task1 : main.o ceaser.o 
            gcc main.o ceaser.o  -o task1
    
    ceaser.o : ceaser.c ceaser.h 
            gcc -c -g -Wall ceaser.c -o $@
    
    main.o : main.c 
            gcc -c -g -Wall main.c -o $@
    
    clean: 
            rm *.o 
    
    cleanall: 
            rm task1 *.o
    

    还要注意的是,这些字符必须是制表符,而不是每个动作行前面的空格。

    要添加到Edward的答案中,请使用简化版本

    all: task1
    
    task1 : main.o ceaser.o 
            gcc $^ -o $@
    
    %.o : %.c
            gcc -c -g -Wall $< -o $@
    
    clean: 
            rm *.o 
    
    cleanall: 
            rm task1 *.o
    
    all:task1
    任务1:main.o ceaser.o
    gcc$^-o$@
    %.o:%.c
    gcc-c-g-Wall$<-o$@
    清洁:
    rm*.o
    清洁所有:
    rm task1*.o
    

    其中“$?”是依赖项列表,“$@”是目标输出,“$注意,makefile仅在需要时才执行命令(源的时间戳比输出文件新).删除所有的*.o文件和task1文件并检查其是否有效。您的缩进也不好,但我想这只是堆栈溢出格式的问题,您似乎丢失了(至少)代码段中的多个换行。所有其他文件都已删除,但仍会删除that@OliverCharlesworth:谢谢--已修复。这是一个很好的答案,但您确实希望在该上下文中使用
    $^
    而不是
    $?
    。区别在于
    $^
    包括所有先决条件,而
    $?
    仅包括新的先决条件r大于目标。对于链接阶段,我们始终希望包含所有
    .o
    文件。$?包括自上次调用make以来已更改的目标。因此,它并不总是尝试构建可用但未更改的目标。对于$^,无论时间戳如何,都会生成所有目标。问题是如果更新
    main.c
    但不更新
    ceaser.c
    链接步骤将是
    gcc main.o-o task1
    ,这是错误的,因为它没有包含
    ceaser.o
    @Edward感谢您提供的信息。更新的答案