簡體   English   中英

在 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'

我查看了這些錯誤,它們似乎是由於使用 32 位編譯器的 CodeBlocks 造成的,但我使用的是 64 位 SDL2 庫。 這是有道理的,因為我的鏈接選項是:

-lmingw32 -lSDL2main -lSDL2

因此,我使用 MinGW 的WinBuilds工具下載了 64 位 MinGW fork,它在新的/mingw-w64/x86_64-8.1.0-posix-seh-rt_v6-rev0/...文件夾中為我提供了大量文件. 然后我轉到 CodeBlocks 的Settings -> Compiler -> Toolchain Executables並將相應的編譯器可執行Settings -> Compiler -> Toolchain Executables指向bin中的 exe。 我的第一個想法是將-lmingw32更改為-lmingw64 ,但這不起作用。 我收到錯誤:

cannot find -lmingw64

在這一點上,我不確定我做對了什么,不正確,什么壞了/工作等,並且非常感謝任何可能的幫助。

可能還值得注意的是,我將 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\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/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是您通過使用-mwindows編譯/鏈接“請求”的特定於 Windows 的入口點,並且對於本機 Win32 GUI 應用程序來說是典型的/必需的。 似乎鏈接SDL2main “導致”了這一點。

  2. 您在各種系統庫和編譯器前綴中看到的“32”反映了您所針對的 API,即所謂的“Win32”,即使在 64 位 Windows 上也是如此。

關於您發布的錯誤信息:

對 C++ 符號的未定義引用意味着您正在使用gcc鏈接,但應該使用g++鏈接, 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 符號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM