使用64位MinGW在代码::: Blocks上进行编译

问题描述 投票:0回答:1

我正在尝试设置我的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
c mingw codeblocks sdl-2 mingw-w64
1个回答
0
投票

一些一般性评论:

  1. 您缺少的最后一个符号WinMain@16是Windows特定的入口点,可通过与-mwindows进行编译/链接来“请求”,并且对于本机Win32 GUI应用程序是典型/必需的。似乎也将SDL2main链接起来是“原因”。

  2. 您在各种系统库和编译器前缀中看到的“ 32”反映了您要定位的API,即使在64位Windows上也被称为“ Win32”。

  3. 关于您发布的错误信息:

    对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符号。

© www.soinside.com 2019 - 2024. All rights reserved.