[英]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
。 您需要提供導致創建該文件的命令。
一些一般性評論:
您缺少的最后一個符號WinMain@16
是您通過使用-mwindows
編譯/鏈接“請求”的特定於 Windows 的入口點,並且對於本機 Win32 GUI 應用程序來說是典型的/必需的。 似乎鏈接SDL2main
“導致”了這一點。
您在各種系統庫和編譯器前綴中看到的“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.