【发布时间】:2016-09-30 02:12:25
【问题描述】:
我正在尝试编译一个使用 SDL2 和 GLEW 的 OpenGl 应用程序,使其可以在它可能发现的任何 Linux 版本上运行——而不仅仅是它最初编译的位置。为此,我尝试了几种方法,但均无效。
我已尝试直接链接到通过在每个库的网站下载中提取的 GLEW 和 SDL 根目录中运行 make 生成的 .a 文件。这会产生以下错误:
/usr/bin/ld: /opt/SDL2-2.0.4/build/.libs/libSDL2.a(SDL_syssem.o): undefined reference to symbol 'sem_getvalue@@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>
注意:我不认为这个问题与 Stack Exchange 网络上的任何其他问题重复,因为我已经尝试了大约一个半月来解决这个问题,并且我已经看到了很多这样的问题并尝试了其中的所有方法,因此,即使症状相同,潜在的问题也不同。
注意:这是一个闭源应用程序,因此不能选择动态链接,因为它需要分发源代码以允许用户在自己的系统上构建二进制文件。
注意:我目前正在尝试通过 g++ 在 Linux 上编译它,但是,我确实打算使用 mingw 来分发这个适用于 Windows 的应用程序。任何可行的建议都比仅适用于 Linux 的建议更可取,但是,如果我无法从最终的结果中弄清楚那部分,我可以问另一个问题。
注意:我使用的是 Ubuntu 16.04 LTS x64 进行编译。
提前感谢您在这个问题上做得这么好。对不起,文字墙,但是,我想提供尽可能多的信息。我期待任何答案!
【问题讨论】:
-
"我正在使用 Ubuntu 16.04 LTS x64 进行编译。"不,必须退回并在 Debian oldstable 上构建所有内容。
标签: c++ opengl sdl-2 static-linking glew