在 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
。 您需要提供命令
导致创建该文件。
一些一般性的评论:
你遗漏的最后一个符号,WinMain@16
是一个 Windows 特定的入口点,你 "request" 通过 compiling/linking 和 -mwindows
并且对于本机 Win32 GUI 应用程序是 typical/necessary。它似乎也链接 SDL2main
"causes" this.
“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 符号。
我正在尝试设置我的 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
。 您需要提供命令
导致创建该文件。
一些一般性的评论:
你遗漏的最后一个符号,
WinMain@16
是一个 Windows 特定的入口点,你 "request" 通过 compiling/linking 和-mwindows
并且对于本机 Win32 GUI 应用程序是 typical/necessary。它似乎也链接SDL2main
"causes" this.“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 符号。