在使用ubuntu20.04 编译开源项目weston时候 遇到问题:
- Found ninja-1.10.0 at /usr/bin/ninja
- ninja: Entering directory `build'
- [115/316] Compiling C object libweston/renderer-gl/gl-renderer.so.p/gl-renderer.c.o
- ../libweston/renderer-gl/gl-renderer.c:74:16: warning: no previous prototype for ‘add_iris_surface_texture’ [-Wmissing-prototypes]
- 74 | WL_EXPORT bool add_iris_surface_texture(int texture){
- | ^~~~~~~~~~~~~~~~~~~~~~~~
- [135/316] Linking target clients/weston-simple-egl
- FAILED: clients/weston-simple-egl
- cc -o clients/weston-simple-egl clients/weston-simple-egl.p/meson-generated_.._.._protocol_xdg-shell-protocol.c.o clients/weston-simple-egl.p/meson-generated_.._.._protocol_ivi-application-protocol.c.o clients/weston-simple-egl.p/simple-egl.c.o -Wl,--as-needed -Wl,--no-undefined -Wl,--start-group shared/libshared.a /usr/lib/x86_64-linux-gnu/libwayland-client.so -lm -lEGL /usr/lib/x86_64-linux-gnu/libwayland-egl.so -lGLESv2 /usr/lib/x86_64-linux-gnu/libwayland-cursor.so -Wl,--end-group
- /usr/bin/ld: 找不到 -lEGL
- /usr/bin/ld: 找不到 -lGLESv2
- collect2: error: ld returned 1 exit status
- [144/316] Generating git-version.h with a custom command
- fatal: 没有发现名称,无法描述任何东西。
- ninja: build stopped: subcommand failed.
- ninja: Entering directory `build'
- [8/175] Linking target clients/weston-simple-egl
这里出现一个很蛋疼的问题,找不到EGL库和GLESv2库,但是在系统中该库是存在着的,如下所示:
- XXX-OptiPlex-7040:/usr/lib/x86_64-linux-gnu$ ls -la libEGL*
- lrwxrwxrwx 1 root root 20 3月 9 00:37 libEGL_mesa.so.0 -> libEGL_mesa.so.0.0.0
- -rw-r--r-- 1 root root 267704 3月 9 00:37 libEGL_mesa.so.0.0.0
- lrwxrwxrwx 1 root root 15 7月 6 20:46 libEGL.so.1 -> libEGL.so.1.1.0
- -rw-r--r-- 1 root root 80512 3月 8 08:21 libEGL.so.1.1.0
- XXX-OptiPlex-7040:/usr/lib/x86_64-linux-gnu$ ls -la libGLES*
- lrwxrwxrwx 1 root root 21 7月 6 20:46 libGLESv1_CM.so.1 -> libGLESv1_CM.so.1.2.0
- -rw-r--r-- 1 root root 43336 3月 8 08:21 libGLESv1_CM.so.1.2.0
- lrwxrwxrwx 1 root root 18 7月 6 20:46 libGLESv2.so.2 -> libGLESv2.so.2.1.0
- -rw-r--r-- 1 root root 72008 3月 8 08:21 libGLESv2.so.2.1.0
-
ld的路径没问题,查看ld的config文件,路径为/etc/ld.so.conf.d/x86_64-linux-gnu.conf,内容为:
- # Multiarch support
- /usr/local/lib/x86_64-linux-gnu
- /lib/x86_64-linux-gnu
- /usr/lib/x86_64-linux-gnu
也没有问题。然后开始在LD_LIBRARY_PATH中添加环境变量,发现也不行。tnnd,见鬼了,这不是明摆着系统是睁眼瞎吗?思考了良久,确认代码本身也没问题,路径不是问题,链接的流程也木有问题,还有什么可能呢?那就是库本身的问题了,这时候留意到一般来说 库文件是这样的,有一个so文件,一个so.1,一个so.1.0.0,好像是少了一个啊,不符合常理,那就加上一个试试,于是执行命令:
- ln -sv libEGL.so.1 libEGL.so
- ln -sv libGLESv2.so.2 libGLESv2.so
修正后ls 如下所示:
- XXX-OptiPlex-7040:/usr/lib/x86_64-linux-gnu$ ls -la libEGL*
- lrwxrwxrwx 1 root root 20 3月 9 00:37 libEGL_mesa.so.0 -> libEGL_mesa.so.0.0.0
- -rw-r--r-- 1 root root 267704 3月 9 00:37 libEGL_mesa.so.0.0.0
- lrwxrwxrwx 1 root root 11 7月 19 17:26 libEGL.so -> libEGL.so.1
- lrwxrwxrwx 1 root root 15 7月 6 20:46 libEGL.so.1 -> libEGL.so.1.1.0
- -rw-r--r-- 1 root root 80512 3月 8 08:21 libEGL.so.1.1.0
- XXX-OptiPlex-7040:/usr/lib/x86_64-linux-gnu$ ls -la libGLES*
- lrwxrwxrwx 1 root root 21 7月 6 20:46 libGLESv1_CM.so.1 -> libGLESv1_CM.so.1.2.0
- -rw-r--r-- 1 root root 43336 3月 8 08:21 libGLESv1_CM.so.1.2.0
- lrwxrwxrwx 1 root root 14 7月 19 17:27 libGLESv2.so -> libGLESv2.so.2
- lrwxrwxrwx 1 root root 18 7月 6 20:46 libGLESv2.so.2 -> libGLESv2.so.2.1.0
- -rw-r--r-- 1 root root 72008 3月 8 08:21 libGLESv2.so.2.1.0
然后再次编译,通过了,如下:
- ninja: Entering directory `build'
- [107/316] Compiling C object libweston/renderer-gl/gl-renderer.so.p/gl-renderer.c.o
- ../libweston/renderer-gl/gl-renderer.c:74:16: warning: no previous prototype for ‘add_iris_surface_texture’ [-Wmissing-prototypes]
- 74 | WL_EXPORT bool add_iris_surface_texture(int texture){
- | ^~~~~~~~~~~~~~~~~~~~~~~~
- [218/316] Generating git-version.h with a custom command
- fatal: 没有发现名称,无法描述任何东西。
- [272/316] Compiling C object libweston/libweston-10.so.0.0.0.p/compositor.c.o
- ../libweston/compositor.c: In function ‘idle_handler’:
- ../libweston/compositor.c:5055:2: warning: ‘return’ with no value, in function returning non-void
- 5055 | return;
- | ^~~~~~
- ../libweston/compositor.c:5051:1: note: declared here
- 5051 | idle_handler(void *data)
- | ^~~~~~~~~~~~
- [316/316] Linking target tests/test-xwayland
- ninja: Entering directory `build'
这样,该部分代码就编译通过了。
来来来,记录一下软件编译时 usr/bin/ld: cannot find -lxxx的错误,主要的解决问题流程如下:
这个鬼问题搞了一天,下一次再遇见这个大坑就可以自救了。