[英]Issues when Statically Compiling SDL2 program
我正在Windows平台(Cygwin上的gcc編譯器,在Windows 7上運行)上使用C和SDL2編寫一個簡單的Hello World類型的程序。
只要使用動態鏈接庫進行編譯,我的程序就可以正常運行,並且SDL2.dll文件與運行的程序位於同一目錄中。
但是,當我在編譯時在gcc行中添加“ -static”編譯器標志時,會出現大量“未定義引用”錯誤,例如:
undefined reference to `_imp__waveInAddBuffer@12'
誰能指出我在哪里出現問題的正確方向?
編輯:我忘記指定要使用MinGW作為我的編譯器工具鏈。
編輯:我包括工作的gcc編譯器標志(摘自下面的接受的答案,以及我自己的一些補充):
-Wl,-Bstatic -lmingw32 -lSDL2main -lSDL2 -Wl,-Bdynamic -lws2_32 -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinm m -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -lcomdlg32 -lhid -lsetupapi
您的問題似乎是特定於Windows的,盡管某些事物非常相似,但其他系統上的事物可能(也可能沒有)不同。
我認為您可以在沒有cygwin1.dll
依賴項的情況下使用cygwin生成可執行文件。
-static
可防止鏈接程序考慮任何動態庫,而不僅僅是SDL。 Windows安裝中有很多dll(因此您可以期望它們會出現在目標系統上),但它們沒有靜態版本,並且如果程序的任何代碼使用了它們(無論是您的代碼還是在其中)情況下(SDL),則無法在此處使用-static
生成可執行文件。 但是,您可以使用某些庫的靜態版本,例如SDL-它將需要具有相應的.a
(或MSVC的.lib
), 並指定該庫具有的所有依賴項(因為.a
沒有內置依賴項信息,而動態庫)),例如對於SDL2,可能類似於
-Wl,-Bstatic SDL2main SDL2 -Wl,-Bdynamic -lws2_32 -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -lcomdlg32
( -Bstatic
要求鏈接器使用之后的庫的靜態版本; -Bdynamic
是反向的; -Wl,...
將選項傳遞給鏈接器)
如果使用mingw,則可能還需要--static-libgcc
和--static-libstdc++
(並且不依賴cygwin dll作為額外的獎勵)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.