1 一个linux系统睁眼瞎的大坑
在使用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_xxx_surface_texture’ [-Wmissing-prototypes]
74 | WL_EXPORT bool add_xxx_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_xxx_surface_texture’ [-Wmissing-prototypes]
74 | WL_EXPORT bool add_xxx_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'
这样,该部分代码就编译通过了。
2 总个下这个蛋疼的问题
来来来,记录一下软件编译时 usr/bin/ld: cannot find -lxxx的错误,主要的解决问题流程如下:
- 检查/etc/ld.so.conf中的库文件路径是否正确,如果库文件不是使用系统路径,/usr/lib, /usr/local/lib, 那么必须在文件中加入。
- ldconfig 重建ld.so.cache文件,ld的库文件检索目录存放文件。尤其刚刚编译安装的软件,必须运行ldconfig,才能将新安装的库文件导入ld.so.cache.
- 确认库文件是否存在,比如-lXXX, 在/usr/lib, /usr/local/lib,或者其他自定义的lib下有无libXXX.so, 如果存在libXXX.so.1和libXXX.so.1.0.0,但没有libXXX.so.,那么可以通过ln -sv lib123.so.1 libXXX.so,建立一个连接重建libXXX.so.
- 如果以上方法还是不行,可以采用 软连接的方式,看哪里缺库就链接到哪里。
这个鬼问题搞了一天,下一次再遇见这个大坑就可以自救了。