【问题标题】:How do I fix collect2 error while compiling an old MUD?如何在编译旧 MUD 时修复 collect2 错误?
【发布时间】:2021-07-17 15:53:45
【问题描述】:

我正在尝试在 Ubuntu 机器上运行 make 来编译 RoT MUD,但我得到的最远的是当我得到 collect2: error: ld returned 1 exit status 时。

这是在终端错误之前出现的(以及许多其他类似的错误):

/usr/bin/ld: obj/wizlist.o:/home/lucas/Projects/R2b5/src/merc.h:3355: multiple definition of `bllmax'; obj/act_comm.o:/home/lucas/Projects/R2b5/src/merc.h:3355: first defined here

根据我收集到的信息,这意味着头文件中包含变量声明,并且使用static 是一个简单的解决方法,但是,我无法弄清楚我应该把那个关键字放在哪里解决此问题的代码。以下是merc.h中唯一提到bllmax

int bllmax, crbmax, crnmax, srpmax, mngmax;

Here 是我要编译的程序。

【问题讨论】:

    标签: c makefile compiler-errors mud


    【解决方案1】:

    您需要了解声明定义之间的区别。 declaration 告诉编译器该符号存在 somewhere 但可能不在这里。 定义告诉编译器符号存在于here

    您显示的行(没有任何上下文)是定义变量,这意味着它们将在包含头文件的每个源文件中定义。

    它应该做的是声明变量,这可以通过将它们设为extern来完成:

    extern int bllmax, crbmax, crnmax, srpmax, mngmax;
    

    然后在单个源文件中定义变量(不带extern)。

    【讨论】:

    • 谢谢,我把“声明”和“定义”搞混了,但这仍然不能回答我的问题。这是曾经可以编译的旧代码,所以我不明白为什么需要进行这些定义extern。不仅如此,程序中还有大约一百个其他定义,所以我必须在每个定义中添加extern,然后为它们创建一个源文件吗?另外,对于我提供的线路,您还希望有什么其他上下文?它位于一个名为 merc.h 的头文件中,并定义了一个变量,该变量位于我在问题中提出的错误中。
    • @LucasAquinodeAssis 自从我查看任何基于 MERC 的源以来已经有很长时间了,但是没有某种条件编译(#ifdef 或类似的)将定义仅放在一个源中文件?另请注意,即使代码库是公开且合法可用的,这并不意味着它实际上是好的,甚至从一开始就可以构建。特别是考虑到它们中的大多数是在很久以前编写的,当时编译器可能不像现在那么严格。
    • @LucasAquinodeAssis 我现在检查了代码,这确实是一个问题。这曾经奏效的唯一原因可能是因为当时的编译器和链接器更加松懈。这些多重定义不是唯一的错误,在尝试构建时我什至无法进入链接阶段。如果你想构建它,你还有很多工作要做。
    猜你喜欢
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    相关资源
    最近更新 更多