代码之家  ›  专栏  ›  技术社区  ›  7e0d05

找不到-lSDL3main:没有这样的文件或目录

  •  0
  • 7e0d05  · 技术社区  · 5 月前

    我最近安装了SDL3。为了熟悉SDL,我想制作一个简单的测试文件,但它不起作用。

    为了编译我的代码,我使用:

    g++ test.cpp -lmingw32 -lSDL3main -lSDL3 -Lsrc/lib
    

    …但我收到了一个关于以下内容的错误 -lSDL3main :

    ...x86_64-w64-mingw32/bin/ld.exe: cannot find -lSDL3main: No such file or directory
    

    所以我想,如果它找不到标记,我为什么不直接删除它呢?我也这么做了,但之后我仍然收到一条错误消息,但这次不一样:

    .../M/B/src/mingw-w64/mingw-w64-crt/crt/crtexewin.c:67:(.text.startup+0xc5): undefined reference to 'WinMain'
    

    对于源代码,我刚刚使用了SDL3 wiki上的演示:

    #include <SDL3/SDL.h>
    #include <iostream>
    
    int main(int argc, char**argv) {
        SDL_Window *window;                    
    
        SDL_Init(SDL_INIT_VIDEO);              
    
        window = SDL_CreateWindow(
            "An SDL3 window",                  // window title
            640,                               // width, in pixels
            480,                               // height, in pixels
            SDL_WINDOW_OPENGL                  // flags - see below
        );
    
          if (window == NULL) {
              SDL_LogError(SDL_LOG_CATEGORY_ERROR, "Could not create window: %s\n", SDL_GetError());
            return 1;
        }
    
        // The window is open: could enter program loop here (see SDL_PollEvent())
    
        SDL_Delay(3000);  // Pause execution for 3000 milliseconds, for example
    
        SDL_DestroyWindow(window);
    
        SDL_Quit();
        return 0;
    }
    
    1 回复  |  直到 5 月前
        1
  •  1
  •   Ahmed AEK    5 月前

    在SDL3中,您不需要链接 SDLmain (它已经不存在了)。相反,在包含您的文件的顶部添加以下内容 main 功能。

    #include <SDL3/SDL_main.h>
    

    引用文档 SDL3 main-function :

    SDL的早期版本有一个静态库SDLmain,您可以将应用程序链接到该库。SDL3仍然具有相同的宏技巧,但静态库已不复存在。现在它是由一个“单头库”提供的,这意味着您可以#include<SDL3/SDL_main.h>

    main需要具有以下签名

    #include <SDL3/SDL.h>
    #include <SDL3/SDL_main.h>
    
    int main(int argc, char **argv)
    {
      // code goes here
      return 0; // not optional
    }
    

    另一个更好的选择是使用 SDL_MAIN_USE_CALLBACKS ,并且没有 主要的 不再有,而是有一些回调。

    #define SDL_MAIN_USE_CALLBACKS 1
    #include <SDL3/SDL.h>
    #include <SDL3/SDL_main.h>
    
    SDL_AppResult SDL_AppInit(void** appstate, int argc, char* argv[]) {
        // initialize application here and fill appstate with your state
    
        return SDL_APP_CONTINUE;
    }
    
    SDL_AppResult SDL_AppEvent(void* appstate, SDL_Event* event) {
        // handle event here
    
        return SDL_APP_CONTINUE;
    }
    
    SDL_AppResult SDL_AppIterate(void* appstate) {
        // draw graphics and game Update here
    
        return SDL_APP_CONTINUE;
    }
    
    void SDL_AppQuit(void* appstate, SDL_AppResult result) {
        // cleanup here
    }
    

    到目前为止,这样做的一些优点是:

    1. 无需修改即可在所有平台上运行(尤其是emscripten)
    2. 在大多数平台(尤其是windows)上调整大小时重新绘制屏幕
    3. 自动帧率控制 SDL_HINT_MAIN_CALLBACK_RATE