【问题标题】:Code::Blocks error: ld returned 1 exit statusCode::Blocks 错误:ld 返回 1 个退出状态
【发布时间】:2017-08-10 00:19:48
【问题描述】:

我正在使用 Code::Blocks v 16.1.0.0 以及随附的 MINGW。链接器有问题。我无法使用#include "sth" 将单个头文件/源文件链接到源文件。为了缩小问题范围,我的项目中只有 1 个源文件和 1 个头文件,但无论我使用什么文件和尝试什么选项,我都无法绕过这个错误。

这是构建日志

-------------- Build: Debug in MISC (compiler: GNU GCC Compiler)---------------

gcc.exe -Wall -Wextra -Wall -g -std=c99  -c C:\Users\username\Documents\CodeBlocks\C\MISC\readFileByChars.c -o obj\Debug\readFileByChars.o
g++.exe -LC:\Users\username\Documents\CodeBlocks\C\MISC -o bin\Debug\MISC.exe obj\Debug\readFileByChars.o readFileByChars.h.gch   
readFileByChars.h.gch: file not recognized: File format not recognized
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 0 second(s))
1 error(s), 0 warning(s) (0 minute(s), 0 second(s))

这是工具链目录:

我没有任何以前运行的程序实例。我也有独立工作的 MINGW(不包括环境变量中的 bin 文件夹,以免在构建过程中混淆代码块),但对于代码块,我包括安装时附带的预打包的代码块。当我单击在我的项目中链接头文件的选项时,项目将不会构建(但如果我不链接文件,我如何构建我的应用程序?)。我再说一遍这个项目是空的,我只有一个头文件和一个源文件。我在这里看到了其他类似的问题,但他们的解决方案不起作用。帮助将不胜感激。谢谢。

【问题讨论】:

    标签: c linker codeblocks linker-errors ld


    【解决方案1】:

    链接器有问题。我无法使用#include "sth" 将单个头文件/源文件链接到源文件

    链接器没有问题。您不能链接头文件或源文件。你只能编译源码 文件(可能是#include 头文件),生成目标文件。

    #include的头文件可以是precompiled header file, 对于支持此概念的编译器,受特定于编译器的限制 关于它的使用(尽管有这个名字,预编译的头文件不是编译的:它不是 一个目标文件)。

    链接器只能链接目标文件和动态库以生成可执行文件。 它可以直接使用目标文件,也可以从静态库中提取它们。

    你失败的链接命令:

    g++.exe -LC:\Users\username\Documents\CodeBlocks\C\MISC -o bin\Debug\MISC.exe obj\Debug\readFileByChars.o readFileByChars.h.gch
    

    表明您正在尝试链接预编译头 readFileByChars.h.gch。链接器说:

    readFileByChars.h.gch: file not recognized: File format not recognized
    

    因为预编译的头文件不是目标文件,也不是静态或动态的 图书馆。这不是链接器理解的东西。

    更正您的项目选项,以便您不再通过readFileByChars.h.gch 作为链接器输入。

    想必你已经通过special steps 在您的 Code::Blocks 项目中生成预编译头 readFileByChars.h.gch。 如果您正确地遵循了该文档,则您无需执行其他任何操作 不提。您的其他项目选项不需要告诉编译器或链接器任何东西 关于预编译的头文件。

    根本不需要使用预编译的头文件,正如您所见,它们的 正确使用并非万无一失,并且是特定于编译器的。我会 建议您以普通方式构建此项目和其他项目,无需预编译头文件, 直到和除非你面临着非常长的编译时间,这 预编译的标头可能会有用地缩减。

    【讨论】:

    • 我认为这是一种更复杂的方式来说明我做错了什么。可能是?对我来说,这个错误没有给我任何额外的信息,只是“ld 返回了 1 个退出状态”。我最终确定我试图在 .h 文件之后但在 .cpp 之前实例化一个变量。该消息没有告诉哪个文件是问题,所以我认为这是一个编译器问题。我想我误解了“预编译”的含义。
    【解决方案2】:

    在工作区

    1. 右键单击包含您的主要方法的文件->选项->(选中)同时启用

    2. 仅针对其他 *.c 文件(检查)编译

    3. 对于 *.h 文件(检查)禁用两者

    构建并运行

    【讨论】:

      【解决方案3】:

      为了解决这个问题,我只是去了 KeyC0de 的“构建日志”部分(而不是“构建消息”),但有些人只能阅读“构建消息”中的消息。 这样,您将可以看到哪个目标文件有问题,从而确定哪个文件有问题:

      C:/Program Files/CodeBlocks/MinGW/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: i386 architecture of input file `obj\Debug\base64.o' is incompatible with i386:x86-64 output
      collect2.exe: error: ld returned 1 exit status
      

      这意味着我的文件 base64.cpp 有问题。就我而言,我只需要删除它,但对你来说可能会有所不同。

      【讨论】:

        【解决方案4】:

        我是如何解决这个问题的: 1. 如果您从项目中运行文件,请先退出代码块。 2.单独打开文件(不要打开codeblocks项目文件!)并运行。

        【讨论】:

          【解决方案5】:

          真正的答案:1.打开任务管理器( ctrl + shift + esc )
          2. 前往详情
          3.搜索项目名称和结束任务(会有一个带有项目名称的.exe)
          完成!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-09-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-26
            相关资源
            最近更新 更多