我正在尝试设置我的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'
我查找了这些错误,它们似乎是由于使用32位编译器的CodeBlocks引起的,但我使用的是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
[目前,我不确定我做得正确,不正确,发生了什么损坏/正在工作,等等,真的会感谢您提供的任何帮助。
也许还值得注意的是,我将64位编译器提取到C:\MinGW
,并指向C:\MinGW\bin
的CodeBlocks作为编译器安装目录。当我单击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\8.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\8.2.0\include\c++\iostream|74|undefined reference to `__ZNSt8ios_base4InitC1Ev'|
c:\mingw\lib\gcc\mingw32\8.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)) ===|
[命令代码块可能正在执行以在单独的日志窗口中进行编译:
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
一些一般性评论:
您缺少的最后一个符号WinMain@16
是Windows特定的入口点,可通过与-mwindows
进行编译/链接来“请求”,并且对于本机Win32 GUI应用程序是典型/必需的。似乎也将SDL2main
链接起来是“原因”。
您在各种系统库和编译器前缀中看到的“ 32”反映了您要定位的API,即使在64位Windows上也被称为“ Win32”。
关于您发布的错误信息:
对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符号。