【问题标题】:undefined reference to SDL_Init对 SDL_Init 的未定义引用
【发布时间】:2015-07-20 16:40:51
【问题描述】:

我今天开始使用 SDL,之前遇到了一些问题,现在我可以运行它,但它不会让我启动它。

这是我的代码:

#include <iostream>
#include "SDL.h"
#undef main

using namespace std;

int main(){
    if(SDL_Init(SDL_INIT_EVERYTHING)<0){
        cout << "error starting sdl" << endl;
    }
    return 0;
}

这是构建日志:

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

mingw32-g++.exe -Wall -g -std=c++11 -IC:\Users\73638G75MA\Documents\SDL2-2.0.3\x86_64-w64-mingw32\include\SDL2 -I"C:\Users\73638G75MA\Documents\C++ projects\Graphics" -c "C:\Users\73638G75MA\Documents\C++ projects\Graphics\main.cpp" -o obj\Debug\main.o
mingw32-g++.exe -LC:\Users\73638G75MA\Documents\SDL2-2.0.3\x86_64-w64-mingw32\lib -o bin\Debug\Graphics.exe obj\Debug\main.o  -lmingw32 -lSDL2main -lSDL2  
obj\Debug\main.o: In function `main':
C:/Users/73638G75MA/Documents/C++ projects/Graphics/main.cpp:8: undefined reference to `SDL_Init'
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))

我会感谢所有可能的帮助,一开始的#undef main 是因为它不会让我运行它。如果它不存在,它会在我创建控制台应用程序时给我一个“未定义的 winmain@16 引用”。

【问题讨论】:

    标签: mingw sdl codeblocks winmain


    【解决方案1】:

    根据包含和库搜索路径...\SDL2-2.0.3\x86_64-w64-mingw32\...,您正在尝试使用 64 位 SDL2 构建。 从编译器名称mingw32-g++来看,我会说你使用的是mingw.org工具链根据Code::Blocks download page和我对codeblocks-13.12mingw-setup.exe内容的检查,包含的工具链只有 32 位,不能创建 64 位二进制文​​件,也不能使用 64 位库。

    如果您想使用预构建的 SDL2,您需要下载匹配的工具链(64 位 mingw-w64)并使用它,或者更改构建参数以使用 SDL2 的 32 位构建(它是存在于development libraries archive 目录中的i686-w64-mingw32 中)。

    【讨论】:

      【解决方案2】:

      这里有几个错误。

      1.

      不要因为你不知道它为什么在这里就取消定义 main!当您使用 SDL 时,main()(几乎)必须看起来像 int main(int, char **) {}所以,删除#undef main 并将int main() 更改为int main(int, char **)

      2.

      在构建 x32 可执行文件时,您必须使用 i686-w64-mingw32 的内容而不是 x86_64-w64-mingw32 因此,请适当调整编译标志。

      x86_64-w64-mingw32 可能适用于 x64 应用程序,但我认为您正在构建 x32 应用程序。

      【讨论】:

        【解决方案3】:

        经过一番苦修后,以下内容对我有用:

        g++ -std=c++17 Test.cpp -I"include" -L"lib" -Wall -lmingw32 -lSDL2main -lSDL2 -lSDL2_image -o Test
        

        一些您可能没有意识到的重要事项:

        • “-l”标志需要放在最后。
        • 即使在使用 mingw-w64 64 位编译器时,“-lmingw32”标志需要在那里。知道我不明白为什么,但我试过了,没有它就行不通。
        • 您的 main 函数必须是 int main(int argc, char* argv[]) {,因为 SDL 需要找到它来接管。

        我的文件结构如下:

        Test/
          include/
            SDL.h
            SDL_main.h
            SDL_image.h
            ...
          lib/
            libSDL2.a
            libSDL2.dll.a
            libSDL2_image.a
            ...
          licenses/
          Test.exe
          SDL2.dll
          SDL2_image.dll
          zlib1.dll
          Test.cpp
          sdl2-config
        

        请注意,我的命令行当前目录位于 Test。
        另请注意,我在环境变量路径上有 mingw-w64 g++ 可执行文件的文件夹。
        另请注意,上述结构中的 ...s 表示应该有更多内容,它们来自 SDL 提供给您的 x86_64 文件夹。

        【讨论】:

          【解决方案4】:

          这对我有用....转到 设置->编译器->链接器设置->在其他链接器选项框中粘贴以下内容 -lmingw32 -lSDL2main -lSDL2

          【讨论】:

          • 请确保在code fences的答案中加入代码/命令
          【解决方案5】:

          在终端或命令提示符下使用下面的代码

          gcc main.c -lSDL2 -lSDL2main -o main
          

          “main.c”是你的文件名

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-27
            • 2022-01-22
            • 2016-04-04
            • 2015-11-03
            • 2011-08-11
            相关资源
            最近更新 更多