【问题标题】:Makefile Giving Duplicate Error CMakefile给出重复错误C
【发布时间】:2018-07-16 05:50:26
【问题描述】:

我创建了一个 makefile 来同时运行 9 个程序。

这9个程序的名称分别是init_aim.c、register.c、sort.c、schedule.c、add.c、class_schedule.c、class_list.c、grade.c和report.c。

在每个文件中我都实现了代码:

#include "aim.h"
int main(){
    return 0;
}

我还有一个带有代码的头文件

#ifndef AIM_H
#define AIM_H
#endif

我唯一的目标是让我的 makefile 正常工作。并添加“all:”规则。我当前的 makefile 看起来像这样。

    AIS: init_aim.o register.o sort.o schedule.o add.o class_schedule.o 
    class_list.o grade.o report.o
        gcc -Wall -ansi -pedantic init_aim.o register.o sort.o 
    schedule.o add.o class_schedule.o class_list.o grade.o report.o -o AIS

    init_aim.o: init_aim.c aim.h
        gcc -Wall -ansi -pedantic -c init_aim.c -o init_aim.o

    register.o: register.c aim.h
        gcc -Wall -ansi -pedantic -c register.c -o register.o

    sort.o: sort.c aim.h
        gcc -Wall -ansi -pedantic -c sort.c -o sort.o

    schedule.o: schedule.c aim.h
        gcc -Wall -ansi -pedantic -c schedule.c -o schedule.o

    add.o: add.c aim.h
        gcc -Wall -ansi -pedantic -c add.c -o add.o

    class_schedule.o: class_schedule.c aim.h
        gcc -Wall -ansi -pedantic -c class_schedule.c -o 
    class_schedule.o

    class_list.o: class_list.c aim.h
        gcc -Wall -ansi -pedantic -c class_list.c -o class_list.o

    grade.o: grade.c aim.h
        gcc -Wall -ansi -pedantic -c grade.c -o grade.o

    report.o: report.c aim.h
        gcc -Wall -ansi -pedantic -c report.c -o report.o

请记住,这里的间距看起来不合适,因为代码太多。

当我运行 make 我得到:

gcc -Wall -ansi -pedantic -c init_aim.c -o init_aim.o
gcc -Wall -ansi -pedantic -c register.c -o register.o
gcc -Wall -ansi -pedantic -c sort.c -o sort.o
gcc -Wall -ansi -pedantic -c schedule.c -o schedule.o
gcc -Wall -ansi -pedantic -c add.c -o add.o
gcc -Wall -ansi -pedantic -c class_schedule.c -o class_schedule.o
gcc -Wall -ansi -pedantic -c class_list.c -o class_list.o
gcc -Wall -ansi -pedantic -c grade.c -o grade.o
gcc -Wall -ansi -pedantic -c report.c -o report.o
gcc -Wall -ansi -pedantic init_aim.o register.o sort.o schedule.o add.o 
class_schedule.o class_list.o grade.o report.o -o AIS
clang: warning: argument unused during compilation: '-ansi' [-Wunused- 
command-line-argument]
    duplicate symbol _main in:
    init_aim.o
    register.o
duplicate symbol _main in:
    init_aim.o
    sort.o
duplicate symbol _main in:
    init_aim.o
    schedule.o
duplicate symbol _main in:
    init_aim.o
    add.o
duplicate symbol _main in:
    init_aim.o
    class_schedule.o
duplicate symbol _main in:
    init_aim.o
    class_list.o
duplicate symbol _main in:
    init_aim.o
    grade.o
duplicate symbol _main in:
    init_aim.o
    report.o
ld: 8 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see 
invocation)
make: *** [AIS] Error 1

如果有人知道如何解决重复错误并添加“all:”命令,请告诉我。

【问题讨论】:

    标签: c linux gcc makefile


    【解决方案1】:

    您已在每个代码文件中定义了main()
    main() 是您尝试创建的可执行文件的“起点”。
    由于多个“从这里开始”点,构建失败。

    换一种说法:
    一个可执行文件中只能有一个 main()

    您可能正在考虑多线程编程。
    在这种情况下,您需要对该主题进行一些研究。

    您可能正在考虑从 shell 运行多个程序。
    在这种情况下,您需要创建多个可执行文件并使用适当的 shell 功能分别启动它们,例如用于后台执行。

    【讨论】:

      【解决方案2】:

      如果您正在编写九个独立的程序,您不应该在最后尝试将它们全部链接在一起。我想这就是你想要的

      all: init_aim register sort schedule add class_schedule class_list grade report
      
      init_aim: init_aim.c aim.h
          gcc -Wall -ansi -pedantic init_aim.c -o init_aim
      
      register: register.c aim.h
          gcc -Wall -ansi -pedantic register.c -o register
      
      ...
      

      我删除了 -c,删除了 .o 并添加了 all 规则。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-31
        • 1970-01-01
        • 1970-01-01
        • 2016-05-09
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        相关资源
        最近更新 更多