Linux 编译链接那些事儿(01) ld链接器的那些坑

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的错误,主要的解决问题流程如下:

  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. 如果以上方法还是不行,可以采用 软连接的方式,看哪里缺库就链接到哪里。

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图王大胜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值