【问题标题】:C++ undefined reference to WinMain@16 (Code::Blocks)C++ 未定义对 WinMain@16 的引用(代码::块)
【发布时间】:2014-02-01 16:46:49
【问题描述】:

我正在使用 Code::Blocks 学习 C++,每次尝试创建新类时,都会收到一条错误消息:

undefined reference to `WinMain@16'

这是我一直在使用的代码:

主类

#include "Lime.h"
#include <iostream>
using namespace std;
int main()
{
    Lime lime;
    return 0;
}

石灰类 (.ccp):

#include "Lime.h"
#include <iostream>
using namespace std;
Lime::Lime()
{
    cout<<"Hi!";
}

石灰标头 (.h):

#ifndef LIME_H
#define LIME_H
class Lime
{
    public:
        Lime();
};
#endif

如果有人知道如何解决它,请告诉我!

【问题讨论】:

  • 您必须自定义链接通过编译两个 .cpp 创建的两个目标文件或将文件放入项目中。
  • 我不知道代码块但您需要启用子系统 CONSOLE
  • @drescherjm,不,这与问题无关。见this answer
  • 所有这些文件都是在同一个项目中制作的,只有重启CodeBlocks才能解决问题,你知道这是为什么吗?
  • 简单地说,您需要创建一个“控制台应用程序”,而不是一个“Win32 GUI 项目”

标签: c++ codeblocks


【解决方案1】:

我在使用 exact 相同的教程时遇到了 exact 相同的问题。

如何解决这个问题? 我发现重新启动 CodeBlocks 可以消除这个错误。它与您创建文件的方式或任何语法无关。重新启动就可以了。

为什么会发生这种情况? 如果我不得不大胆猜测,我会认为 CodeBlocks 确实创建了 header/cpp 文件,但是它并没有以适当的方式将它们链接到您的项目以使它们可用(尽管它确实要求您将它们链接到创建它们后的项目)。这是一个猜测。

我知道有些人对此发表评论说您正在创建 Windows GUI 控制台应用程序而不是控制台应用程序,但事实并非如此。正如 Bucky 在视频中解释的那样,我也在创建一个简单的控制台应用程序。

【讨论】:

  • 这对我来说是正确的答案。 CodeBlocks 突然开始抱怨 WinMain 在一个到目前为止编译良好的项目上。重启就行了。
  • 太棒了。我正在做同样的事情,通过完全相同的教程,使用完全相同的程序,并且遇到完全相同的问题,而这个完全相同的解决方案可以工作。谢谢!
  • 很高兴我能帮上忙!
【解决方案2】:

试试这个: Settings->Compiler,点击标签Build options,勾选复选框

显式添加当前正在编译的文件目录到编译器搜索目录

附言

下次创建新课程时,请确保在 File policy 部分中选中复选框

  • 添加项目路径

  • 头文件和实现文件应该在同一个文件夹中

但是,请选择

使用相对路径

【讨论】:

  • 我遇到了和 OP 一样的问题,现在解决了,谢谢。
  • 终于有一个简单的不头痛的答案了!!
【解决方案3】:

转到菜单栏上的"Project" --&gt; "Build Options . . ."
转到"Linker Settings" 标签
"Link libraries" 面板中,单击"Add"
在即将到来的字段中写下这个: mingw32;libSDL.a;libSDLmain.a
转到"Search directories" --&gt; "Linker" 标签
在那里添加您的 MinGW 库文件夹!祝你好运!!

【讨论】:

    【解决方案4】:

    看起来您正在构建 Windows 应用程序,而不是控制台应用程序。因此,您需要一个 WinMain 函数作为程序入口点,而不是 main

    我对 CodeBlocks 不是很熟悉,但是在项目设置中的某个地方会有一个设置可以让您指定程序正在其中运行的子系统。它可能会说“Windows”,其中一个选项应该是“控制台”,所以如果你真的想要一个控制台应用程序,你可以将其更改为。从您使用cout 的事实来看,我怀疑控制台应用程序是您想要的。如果是,那么您可以将main 作为您的入口点。

    您还可以在创建新项目时选择控制台应用程序。 This screenshot 和文字应该会有所帮助。

    注意:我刚刚检查了更多内容,在 Project/target option 中,您可以转到“构建目标”选项卡并查看您正在构建的子系统。它在选项卡上称为“类型”,下拉选项之一将是“控制台应用程序”。

    【讨论】:

    • 确实选择了Console Application,在目标选项中显示Console Applications
    【解决方案5】:

    这个问题出现在我看来是因为项目中没有包含“main.cpp”。如果您再次看到该错误,请确保您的项目中包含所有文件。

    【讨论】:

      【解决方案6】:

      我已通过打开编译器设置对话框并单击“确定”来解决此问题。没有改变。而且真的很管用!

      但是如果你再次添加一个新类,这个问题就会重复。因此,每次创建新类时只需打开/关闭设置对话框即可。

      【讨论】:

      • 刚刚尝试了站在我旁边的建议“试试这个:设置 - >编译器,单击选项卡构建选项,选中复选框” - 必须设置此标志
      【解决方案7】:

      它非常简单并且对我有用......您所要做的就是选择“打开现有项目”,一旦您打开代码块,就会出现在开始选项卡中,然后选择(您的项目名称).cbp 文件。 ..该程序将打开您的项目以及类名 .h 和 .cpp 文件...您构建并运行...瞧,您的代码将正常工作..

      【讨论】:

      • 不幸的是,事情没有那么简单。
      【解决方案8】:

      我之前也遇到过这些问题,如果您有很多包含头文件的文件,我的解决方案是创建一个项目。这样,当您编写#include "Burrito.h" 代码时,编辑器将在您的项目中查找头文件。尤其是对于 Dev-cpp 编辑器。

      【讨论】:

        【解决方案9】:

        我也遇到了这个问题! 问题是我把我的主要功能放在一个特定的命名空间下,而我的类不属于这个命名空间,看起来我没有它们的“主要”。一旦我删除了命名空间/将类添加到同一个命名空间,构建问题就消失了。

        【讨论】:

          【解决方案10】:

          试试这个:设置->编译器,点击选项卡构建选项,选中复选框

          将当前正在编译的文件的目录显式添加到编译器搜索目录

          我做到了,现在我工作得很好

          【讨论】:

            【解决方案11】:

            修复:未定义的对 `WinMain@16' 的引用或未定义的对代码块中的 'class-name::class-name()' 的引用 CodeBlocks 中的错误

            我有同样的问题。实际上它很容易修复。在菜单栏上转到

            项目 --> 构建选项 勾选让 g++ 遵循 C++11 ISO C++ 语言标准 [-std=c++11]
            然后单击确定并构建并运行您的项目 [F9]click here to see screen capture image. Separate Class files code blocks fix

            【讨论】:

              猜你喜欢
              • 2015-06-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-07-30
              • 2021-11-18
              • 2013-01-15
              相关资源
              最近更新 更多