我試圖編譯一個使用SDL2和GLEW的OpenGl應用程序,它可以在它可能發現的任何版本的Linux上運行,而不僅僅是它最初編譯的位置。要做到這一點,我嘗試了幾件事情,其中沒有一件可以工作。如何在Linux上靜態編譯SDL2和GLEW應用程序?
我試着直接連接到.a文件,通過在每個庫的網站下載中提取的GLEW和SDL根目錄下運行make生成。這將產生以下錯誤:
/usr/bin/ld: /opt/SDL2-2.0.4/build/.libs/libSDL2.a(SDL_syssem.o): undefined reference to symbol '[email protected]@GLIBC_2.2.5'
//lib/x86_64-linux-gnu/libpthread.so.0: error adding symbols: DSO missing from command line
我已經嘗試建設爲我做的動態鏈接庫,其中工程除跨平臺能力,(與pkg-config --libs sdl2
和pkg-config --libs glew
),但加入-static
精細,在這一點上我得到以下錯誤:
/usr/bin/ld: cannot find -lGLEW
/usr/bin/ld: cannot find -lGL
當我改變以前的情景指向我的靜態編譯GLEW庫,我得到了一個未定義引用錯誤,以OpenGL函數與像許多SDL功能的以下未定義的引用錯誤一起。添加-lGL不會改變任何東西。
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libSDL2.a(SDL_dynapi.o): In function `SDL_InitDynamicAPI':
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libSDL2.a(SDL_dynapi.o): In function `SDL_InitDynamicAPI':
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libSDL2.a(SDL_dynapi.o): In function `SDL_InitDynamicAPI':
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libSDL2.a(SDL_sysloadso.o): In function `SDL_LoadObject_REAL':
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libSDL2.a(SDL_sysloadso.o): In function `SDL_LoadObject_REAL':
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libSDL2.a(SDL_sysloadso.o): In function `SDL_LoadFunction_REAL':
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libSDL2.a(SDL_sysloadso.o): In function `SDL_LoadFunction_REAL':
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libSDL2.a(SDL_sysloadso.o): In function `SDL_LoadFunction_REAL':
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libSDL2.a(SDL_sysloadso.o): In function `SDL_UnloadObject_REAL':
當我嘗試使用pkg-config --libs --static <library name>
所有庫,我得到以下錯誤:
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libSDL2.a(SDL_dynapi.o): In function `SDL_InitDynamicAPI':
/usr/bin/ld: cannot find -lasound
/usr/bin/ld: cannot find -lpulse-simple
/usr/bin/ld: cannot find -lpulse
/usr/bin/ld: cannot find -lsndio
/usr/bin/ld: cannot find -lwayland-egl
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libwayland-cursor.a(libwayland_cursor_la-xcursor.o): In function `XcursorImagesDestroy':
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libXcursor.a(file.o):(.text+0x7d0): first defined here
/usr/bin/ld: cannot find -lGLEW
/usr/bin/ld: cannot find -lGL
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libX11.a(GetDflt.o): In function `GetHomeDir.part.0':
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libX11.a(GetDflt.o): In function `GetHomeDir.part.0':
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/libX11.a(xim_trans.o): In function `_XimXTransSocketINETConnect':
collect2: error: ld returned 1 exit status
注意:所有的輸出上面的命令g++ -o /path/to/outputExecutable <list of object files>.o <libraries as described above>
注:我不認爲這個問題是堆棧交換網絡上任何其他問題的重複,因爲我一直試圖弄清楚這個問題大約一個半月,而且我看到了很多這些問題並嘗試了其中的所有內容,因此,即使s基本問題是不同的,ymptoms是一樣的。
注意:這是一個封閉的源代碼應用程序,因此動態鏈接不是一個選項,因爲它需要分發源代碼以允許用戶在自己的系統上構建二進制文件。
注意:我目前正試圖通過g ++將它與Linux進行編譯,但是我打算使用mingw來爲Windows分發此應用程序。任何在那裏工作的建議都優於僅限於Linux的建議,但是,如果我無法弄清楚最終會發生什麼,那麼我可以提出另一個問題。
注:我正在使用Ubuntu 16.04 LTS x64進行編譯。
預先感謝您在這個問題中甚至得到這個。對不起,我想提供儘可能多的信息。我期待着任何答案!
「我正在使用Ubuntu 16.04 LTS x64進行編譯。」不管怎麼說,都得退後一步,在Debian的舊版本上構建一切。 – genpfault