在 Code::Blocks 上使用 64 位 MinGW 编译

Compiling with 64-bit MinGW on Code::Blocks

我正在尝试设置我的 Code::Blocks 安装以使用 SDL2 图形 API。正如文档所建议的那样,一旦我安装并正确指定了所有内容,我就尝试了 SDL_Init(SDL_INIT_EVERYTHING) 测试,如:

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

int main (int argc, char *argv[])
{
    if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
    {
        printf("\nSDL2 could not be initialized! Code: %s\n", SDL_GetError());
    }

    return EXIT_SUCCESS;
}

但是,我收到以下错误:

...in function 'SDL_Main':
undefined reference to `SDL_Init`
undefined reference to `SDL_GetError`
undefined reference to 'WinMain@16'

我查看了这些错误,它们似乎是由于 CodeBlocks 使用 32 位编译器造成的,但我使用的是 64 位 SDL2 库。这是有道理的,因为我的链接选项是:

-lmingw32 -lSDL2main -lSDL2

因此,我使用 MinGW 的 WinBuilds 工具下载了 64 位 MinGW 分支,它在新的 /mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/... 文件夹中为我提供了大量文件。然后我转到 CodeBlocks 的 Settings -> Compiler -> Toolchain Executables 并将相应的编译器可执行文件指向 bin 中的 exe。我的第一个想法是然后将 -lmingw32 更改为 -lmingw64,但这不起作用。我收到错误:

cannot find -lmingw64

在这一点上,我不确定我做对了什么,做错了什么,broken/working 等等,非常感谢任何可能的帮助。

可能还值得注意的是,我将64位编译器解压到C:\MinGW并将CodeBlocks指向C:\MinGW\bin作为编译器安装目录。当我单击 Auto-Detect 时,它似乎很高兴并声明它已自动在该位置找到 GCC 编译器。因此,一定是我的 -lmingw64 标记有误,或者我指定的其他内容。

编辑:64 位编译器已正确设置和检测,但继续产生与 SDL 函数相关的错误:

||=== Build: Debug in Initialization_Test (compiler: GNU GCC Compiler) ===|
obj\Debug\main.o||In function `SDL_main':|
C:\C\SDL_C_Graphics\Init_Test\Initialization_Test\main.cpp|8|undefined reference to `_SDL_Init'|
C:\C\SDL_C_Graphics\Init_Test\Initialization_Test\main.cpp|10|undefined reference to `_SDL_GetError'|
C:\C\SDL_C_Graphics\Init_Test\Initialization_Test\main.cpp|10|undefined reference to `_printf'|
obj\Debug\main.o||In function `__tcf_0':|
c:\mingw\lib\gcc\mingw32.2.0\include\c++\iostream|74|undefined reference to `__ZNSt8ios_base4InitD1Ev'|
obj\Debug\main.o||In function `__static_initialization_and_destruction_0':|
c:\mingw\lib\gcc\mingw32.2.0\include\c++\iostream|74|undefined reference to `__ZNSt8ios_base4InitC1Ev'|
c:\mingw\lib\gcc\mingw32.2.0\include\c++\iostream|74|undefined reference to `_atexit'|
C:\SDL_Dev\SDL2-2.0.12\x86_64-w64-mingw32\lib\libSDL2main.a(SDL_windows_main.o)||In function `main_getcmdline':|
\Users\valve\release\SDL\SDL2-2.0.12-source\foo-x64\..\src\main\windows\SDL_windows_main.c|71|undefined reference to `SDL_main'|
||error: ld returned 1 exit status|
||=== Build failed: 8 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

命令代码块可能正在执行编译,在单独的日志中 window:

x86_64-w64-mingw32-g++.exe -LC:\SDL_Dev\SDL2-2.0.12\x86_64-w64-mingw32\lib -LC:\SDL_Dev\SDL2-2.0.12\x86_64-w64-mingw32\lib -LC:\SDL_Dev\SDL_Img\SDL2_image-2.0.5\x86_64-w64-mingw32\lib -LC:\SDL_Dev\SDL_Mixer\SDL2_mixer-2.0.4\x86_64-w64-mingw32\lib -L"C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\lib" -o bin\Debug\Initialization_Test.exe obj\Debug\main.o  -lmingw32 -lSDL2main -lSDL2  -lmingw32 -lSDL2main -lSDL2.dll -luser32 -lgdi32 -lwinmm -ldxguid
C:/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\main.o' is incompatible with i386:x86-64 output

UPDATE 您最后的编辑显示了输出中最重要的部分(顺便说一句,它也是输出的第一部分):

C:/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\main.o' is incompatible with i386:x86-64 output

这是告诉您正在混合 32 位和 64 位二进制文​​件的链接器。 您似乎将源文件 main.cpp 编译成了 32 位二进制对象 obj\Debug\main.o您需要提供命令 导致创建该文件。


一些一般性的评论:

  1. 你遗漏的最后一个符号,WinMain@16 是一个 Windows 特定的入口点,你 "request" 通过 compiling/linking 和 -mwindows 并且对于本机 Win32 GUI 应用程序是 typical/necessary。它似乎也链接 SDL2main "causes" this.

  2. “32"s you see in various system libraries and compiler prefixes reflects the API you're targeting, which is called "Win32”,即使在 64 位 Windows.

关于您发布的错误信息:

对 C++ 符号的未定义引用意味着您正在与 gcc 链接,但应该与 g++ 链接,它会自动链接到您需要的 C++ 位。这些缺失的符号是必需的,因为您包含了 <iostream>,这会导致一些全局初始化发生。

我无法使用 MSYS2 的 SDL2 版本重现您的链接器错误。您的测试代码为我提供了以下输出:

g++ main.cpp -o sdl_test -lSDL2main -lSDL2
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.3.0/../../../../x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o): in function `main':
D:/mingwbuild/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crt0_c.c:18: undefined reference to `WinMain'
collect2.exe: error: ld returned 1 exit status

为此,我可以参考上面的第 1 点。但这不是您的问题,因为它首先抱怨 SDL 符号。