【问题标题】:GCC C++ linking error : Undefined reference to 'WinMain@16' [duplicate]GCC C++ 链接错误:未定义对“WinMain@16”的引用 [重复]
【发布时间】:2021-07-18 05:19:37
【问题描述】:

当我尝试构建我的项目时,我在 Codelite 上遇到了链接问题。我收到错误“未定义对“WinMain@16”的引用。

#include <stdio.h>
#include <SDL2/SDL.h>

int main()
{
    
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_Quit();
        
    return 0;
}

这是我的主文件,我正在尝试将 SDL 库用于我正在处理的项目。最初,我曾经收到错误“未定义对 SDL_Init() 的引用”。然后我将 SDL2 包含在项目链接器设置中。现在我在 WinMain@16 上得到同样的错误。

这是链接的问题吗?我应该在我的项目设置中包含一个库以消除此错误吗?

这是关于我的 MinGW 的信息。

Using built-in specs.
COLLECT_GCC=D:\Min_GW\bin\gcc.exe
COLLECT_LTO_WRAPPER=d:/min_gw/bin/../libexec/gcc/mingw32/9.2.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-9.2.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --target=mingw32 --disable-win32-registry --with-arch=i586 --with-tune=generic --enable-static --enable-shared --enable-threads --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --enable-libgomp --disable-libvtv --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --disable-build-format-warnings --prefix=/mingw --with-gmp=/mingw --with-mpfr=/mingw --with-mpc=/mingw --with-isl=/mingw --enable-nls --with-pkgversion='MinGW.org GCC Build-2'
Thread model: win32
gcc version 9.2.0 (MinGW.org GCC Build-2)

【问题讨论】:

  • 您忘记将-lSDL2main 添加到链接器标志中,有关详细信息,请参阅链接线程。即使使用 WinMain 有效,这也不是预期的解决方案。

标签: c++ gcc mingw sdl-2 codelite


【解决方案1】:

使用以下参数将您的 main 重命名为 WinMain

INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR lpCmdLine, INT nCmdShow)
{
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_Quit();
    
    return 0;
}

大部分参数都需要#include &lt;windows.h&gt; 如果该标头不可用,则声明为:

int __stdcall WinMain(void*, void*, char*, int)

【讨论】:

  • 非常感谢,它有效。但是为什么它不能与正常的 main() 函数一起使用呢?
  • @karthikkk - 我不确定您的构建环境是什么,但您显然正在构建为 Win32 GUI 应用程序,这可能是您想要的,而不是控制台应用程序。
  • 这与构建环境无关。 MinGW 将 (IIRC) 接受 mainWinMain 而没有任何特殊标志。问题是由 SDL 标头中的 #define main SDL_main 引起的,因为它想在实际的 main 之前注入一些自定义初始化。它在 OP 的情况下出现故障,因为他们未能提供一些必需的链接器标志。
  • 那么当他执行他的程序时,入口点是什么?调用他的SDL_InitWinMain 或SDL 提供的一些预构建的main
  • OP 应该有一个SDL_main(又名main,因为宏),它会被实际的WinMain()/main(不确定是哪一个)调用SDL。
猜你喜欢
  • 1970-01-01
  • 2020-07-18
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 2013-01-15
相关资源
最近更新 更多