• Linux基础 常见问题 ld链接器的那些坑


    1 一个linux系统睁眼瞎的大坑

    在使用ubuntu20.04 编译开源项目weston时候 遇到问题:

    1. Found ninja-1.10.0 at /usr/bin/ninja
    2. ninja: Entering directory `build'
    3. [115/316] Compiling C object libweston/renderer-gl/gl-renderer.so.p/gl-renderer.c.o
    4. ../libweston/renderer-gl/gl-renderer.c:74:16: warning: no previous prototype for ‘add_iris_surface_texture’ [-Wmissing-prototypes]
    5. 74 | WL_EXPORT bool add_iris_surface_texture(int texture){
    6. | ^~~~~~~~~~~~~~~~~~~~~~~~
    7. [135/316] Linking target clients/weston-simple-egl
    8. FAILED: clients/weston-simple-egl
    9. 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
    10. /usr/bin/ld: 找不到 -lEGL
    11. /usr/bin/ld: 找不到 -lGLESv2
    12. collect2: error: ld returned 1 exit status
    13. [144/316] Generating git-version.h with a custom command
    14. fatal: 没有发现名称,无法描述任何东西。
    15. ninja: build stopped: subcommand failed.
    16. ninja: Entering directory `build'
    17. [8/175] Linking target clients/weston-simple-egl

    这里出现一个很蛋疼的问题,找不到EGL库和GLESv2库,但是在系统中该库是存在着的,如下所示:

    1. XXX-OptiPlex-7040:/usr/lib/x86_64-linux-gnu$ ls -la libEGL*
    2. lrwxrwxrwx 1 root root 20 3月 9 00:37 libEGL_mesa.so.0 -> libEGL_mesa.so.0.0.0
    3. -rw-r--r-- 1 root root 267704 3月 9 00:37 libEGL_mesa.so.0.0.0
    4. lrwxrwxrwx 1 root root 15 7月 6 20:46 libEGL.so.1 -> libEGL.so.1.1.0
    5. -rw-r--r-- 1 root root 80512 3月 8 08:21 libEGL.so.1.1.0
    6. XXX-OptiPlex-7040:/usr/lib/x86_64-linux-gnu$ ls -la libGLES*
    7. lrwxrwxrwx 1 root root 21 7月 6 20:46 libGLESv1_CM.so.1 -> libGLESv1_CM.so.1.2.0
    8. -rw-r--r-- 1 root root 43336 3月 8 08:21 libGLESv1_CM.so.1.2.0
    9. lrwxrwxrwx 1 root root 18 7月 6 20:46 libGLESv2.so.2 -> libGLESv2.so.2.1.0
    10. -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,内容为:

    1. # Multiarch support
    2. /usr/local/lib/x86_64-linux-gnu
    3. /lib/x86_64-linux-gnu
    4. /usr/lib/x86_64-linux-gnu

    也没有问题。然后开始在LD_LIBRARY_PATH中添加环境变量,发现也不行。tnnd,见鬼了,这不是明摆着系统是睁眼瞎吗?思考了良久,确认代码本身也没问题,路径不是问题,链接的流程也木有问题,还有什么可能呢?那就是库本身的问题了,这时候留意到一般来说 库文件是这样的,有一个so文件,一个so.1,一个so.1.0.0,好像是少了一个啊,不符合常理,那就加上一个试试,于是执行命令:

    1. ln -sv libEGL.so.1 libEGL.so
    2. ln -sv libGLESv2.so.2 libGLESv2.so

    修正后ls 如下所示:

    1. XXX-OptiPlex-7040:/usr/lib/x86_64-linux-gnu$ ls -la libEGL*
    2. lrwxrwxrwx 1 root root 20 3月 9 00:37 libEGL_mesa.so.0 -> libEGL_mesa.so.0.0.0
    3. -rw-r--r-- 1 root root 267704 3月 9 00:37 libEGL_mesa.so.0.0.0
    4. lrwxrwxrwx 1 root root 11 7月 19 17:26 libEGL.so -> libEGL.so.1
    5. lrwxrwxrwx 1 root root 15 7月 6 20:46 libEGL.so.1 -> libEGL.so.1.1.0
    6. -rw-r--r-- 1 root root 80512 3月 8 08:21 libEGL.so.1.1.0
    7. XXX-OptiPlex-7040:/usr/lib/x86_64-linux-gnu$ ls -la libGLES*
    8. lrwxrwxrwx 1 root root 21 7月 6 20:46 libGLESv1_CM.so.1 -> libGLESv1_CM.so.1.2.0
    9. -rw-r--r-- 1 root root 43336 3月 8 08:21 libGLESv1_CM.so.1.2.0
    10. lrwxrwxrwx 1 root root 14 7月 19 17:27 libGLESv2.so -> libGLESv2.so.2
    11. lrwxrwxrwx 1 root root 18 7月 6 20:46 libGLESv2.so.2 -> libGLESv2.so.2.1.0
    12. -rw-r--r-- 1 root root 72008 3月 8 08:21 libGLESv2.so.2.1.0

    然后再次编译,通过了,如下:

    1. ninja: Entering directory `build'
    2. [107/316] Compiling C object libweston/renderer-gl/gl-renderer.so.p/gl-renderer.c.o
    3. ../libweston/renderer-gl/gl-renderer.c:74:16: warning: no previous prototype for ‘add_iris_surface_texture’ [-Wmissing-prototypes]
    4. 74 | WL_EXPORT bool add_iris_surface_texture(int texture){
    5. | ^~~~~~~~~~~~~~~~~~~~~~~~
    6. [218/316] Generating git-version.h with a custom command
    7. fatal: 没有发现名称,无法描述任何东西。
    8. [272/316] Compiling C object libweston/libweston-10.so.0.0.0.p/compositor.c.o
    9. ../libweston/compositor.c: In function ‘idle_handler’:
    10. ../libweston/compositor.c:5055:2: warning: ‘return’ with no value, in function returning non-void
    11. 5055 | return;
    12. | ^~~~~~
    13. ../libweston/compositor.c:5051:1: note: declared here
    14. 5051 | idle_handler(void *data)
    15. | ^~~~~~~~~~~~
    16. [316/316] Linking target tests/test-xwayland
    17. ninja: Entering directory `build'

    这样,该部分代码就编译通过了。

    2 总个下这个蛋疼的问题

    来来来,记录一下软件编译时 usr/bin/ld: cannot find -lxxx的错误,主要的解决问题流程如下:

    1. 检查/etc/ld.so.conf中的库文件路径是否正确,如果库文件不是使用系统路径,/usr/lib, /usr/local/lib, 那么必须在文件中加入。
    2. ldconfig 重建ld.so.cache文件,ld的库文件检索目录存放文件。尤其刚刚编译安装的软件,必须运行ldconfig,才能将新安装的库文件导入ld.so.cache.
    3. 确认库文件是否存在,比如-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.
    4. 如果以上方法还是不行,可以采用 软连接的方式,看哪里缺库就链接到哪里。

    这个鬼问题搞了一天,下一次再遇见这个大坑就可以自救了。

  • 相关阅读:
    uniapp手机一键登录,微信授权登陆
    类型体系与基本数据类型(第二节)
    传统Tier1「杀红眼」!Mobileye阵营寻求「强化」感知能力
    什么牌子的蓝牙耳机好?音质好的蓝牙耳机推荐
    nexus命令行上传jar包
    vue项目中使用lottie
    独立站引流篇创建独立站博客页面,回报率高13倍
    cpp primer plus笔记06-函数
    JAVA开发管理(敏捷如何解决实际痛点问题)
    Python动态属性有什么用
  • 原文地址:https://blog.csdn.net/vviccc/article/details/125879646