概述
我手头上有一款型号为Dell XPS 15 9560的笔记本电脑,2017年买的,有些小贵,不过相对来说,还是蛮好用的。一直以来,我都是在上面跑Linux mint,跑了很多年。
早些年,用钉钉的话,有Web钉钉,在浏览器中输入https://im.dingtalk.com/,就可以进入Web钉钉系统了,用起来 相当方便。
新冠疫情前后,发现Web钉钉就用不了。于时,我就不得不找可以在Linux环境下跑的钉钉版本。经过多方尝试,发现优麒麟应用仓库中提供了一个钉钉的deb包,我将它放在Linux mint中试着跑,用起来也还说得过去。
2023年下半年到今年清明节前后,我发现钉钉官网上发布了关于钉钉的Linux软件包,下载下来安装起来跑了一下,感觉也还行。
2025年6月1日前后,电脑出现了问题,我就重新安装了电脑,当我再次前往钉钉官网下载钉钉的Linux版本的软件包安装以后,点击系统菜单中的钉钉菜单时,发现始终没有反应。由于工作上事情比较多,然后我就将其卸载了。
2025年6月20日晚上,周五,也没啥事,索性就研究一下,看看到咋回事。当我前往钉钉官网下载页面https://www.dingtalk.com/download?spm=a213l2.13146415.0.0.7f153146PcshWh时,发现已经没有了Linux版本。正好,我本地有麒麟桌面版(Kylin-Desktop-V10-SP1-2503-HWE-PP-Release-20250430-X86_64.iso),于是我,在虚拟机Virtualbox 7.10中安装了Kylin-Desktop-V10-SP1-2503-HWE-PP-Release-20250430-X86_64.iso,然后在应用商店找到了钉钉,下载并安装了它,发现钉钉在麒麟桌面10中,运行良好。于是,我将下载到麒麟桌面10中的钉钉传回了宿主机Linux mint 22.1中。当我安装完成,再次启动时,发现钉钉依然启动不了。
对于一个看代码如看小说的码友来说,还是想一探究竟。
查找原因
于是,我用文本编辑器打开了菜单文件,发现内容如下:
[Desktop Entry]
Categories=Chat;Office;
Comment=
Exec=/opt/apps/com.alibabainc.dingtalk/files/Elevator.sh %u
GenericName=dingtalk
Icon=/opt/apps/com.alibabainc.dingtalk/files/logo.ico
Keywords=dingtalk;
MimeType=x-scheme-handler/dingtalk;
Name=钉钉
Type=Application
X-Deepin-Vendor=user-custom
依据上述文件内容,系统启动的时候,实际上运行的是文件/opt/apps/com.alibabainc.dingtalk/files/Elevator.sh。于是,我们打开命令行终端,前往目录/opt/apps/com.alibabainc.dingtalk/files,这里,我们看到当前目录内容如下:
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files$ ll
total 336
drwxr-xr-x 4 root root 4096 Jun 21 15:30 ./
drwxr-xr-x 4 root root 4096 Jun 21 01:53 ../
drwxr-xr-x 14 root root 16384 Jun 21 15:23 7.6.45-Release.5032501/
drwxr-xr-x 3 root root 4096 Jun 21 01:53 doc/
-rwxr-xr-x 1 root root 2507 Jun 21 15:30 Elevator.sh*
-rw-r--r-- 1 root root 305311 Mar 25 11:42 logo.ico
-rw-r--r-- 1 root root 23 Mar 25 11:42 version
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files$
这们尝试着执行文件Elevator.sh:
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files$ ./Elevator.sh
[sudo] password for lwk:
linuxmint
linuxmint branch
preload_libs=./libgbm.so ./plugins/dtwebview/libcef.so
ERROR: ld.so: object './libgbm.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.
./com.alibabainc.dingtalk: ./libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by /lib/x86_64-linux-gnu/libgallium-24.2.8-1ubuntu1~24.04.1.so)
./com.alibabainc.dingtalk: ./libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /lib/x86_64-linux-gnu/libgallium-24.2.8-1ubuntu1~24.04.1.so)
./com.alibabainc.dingtalk: ./libstdc++.so.6: version `GLIBCXX_3.4.28' not found (required by /lib/x86_64-linux-gnu/libgallium-24.2.8-1ubuntu1~24.04.1.so)
./com.alibabainc.dingtalk: ./libstdc++.so.6: version `CXXABI_1.3.13' not found (required by /lib/x86_64-linux-gnu/libLLVM.so.19.1)
./com.alibabainc.dingtalk: ./libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /lib/x86_64-linux-gnu/libLLVM.so.19.1)
./com.alibabainc.dingtalk: ./libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /lib/x86_64-linux-gnu/libLLVM.so.19.1)
./com.alibabainc.dingtalk: ./libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by /lib/x86_64-linux-gnu/libLLVM.so.19.1)
./com.alibabainc.dingtalk: ./libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /lib/x86_64-linux-gnu/libicuuc.so.74)
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files$
这里,我们看到,系统因为以下原因退出了:
- 找不到动态链接库
libgbm.so。 - 动态链接库
libstdc++.so.6中关于共享库GLIBCXX的版本不支持3.4.26~3.4.30这些版本,也就是说,版本过老。
接下来,我们需要确定以几件事:
- 上面提到的两个动态链接库中提到的
./libgbm.so、./libstdc++.so.6在什么地方。 libstdc++.so.6中关于共享库GLIBCXX的版本到底是多少。
为了解开以上疑难,我们需要先看看文件Elevator.sh到底干了些什么事。以下是文件Elevator.sh的内容:
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files$ cat Elevator.sh
#!/bin/sh
export QT_QPA_PLATFORM=xcb
export QT_PLUGIN_PATH=/opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501
cd /opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501
preload_libs="./libgbm.so "# check os_info
os_name=`cat /etc/os-release | grep ^ID= | cut -d'=' -f 2`
echo ${os_name}# check architecture
os_machine=`uname -m`libc_version=`ldd --version | grep ldd | cut -d' ' -f5`
libc_version_num=`echo "${libc_version}" | tr '.' ' '`
libc_version_m=0
libc_version_b=0
libc_lower=false
libc_lower_29=false # for cef109for ia in ${libc_version_num}; doif [ ${libc_version_m} -eq 0 ]; thenlibc_version_m=$iaelif [ ${libc_version_b} -eq 0 ]; thenlibc_version_b=$iafi
doneif [ ${libc_version_m} -lt 2 ]; thenlibc_lower=truelibc_lower_29=true
fi
if [ ${libc_version_b} -lt 28 ]; thenlibc_lower=true
fi
if [ ${libc_version_b} -lt 29 ]; thenlibc_lower_29=true
fi
if [ ${libc_version_m} -gt 2 ]; thenlibc_lower=falselibc_lower_29=false
fiif [ "${os_name}" = "kylin" ]; thenecho kylin branchif [ "${libc_lower}" = "true" ]; then echo kylin v10 branch preload_libs="./envlib.so ./libharfbuzz.so.0.20301.0 ./libgbm.so ./libidn2.so.0 ./libunistring.so.2 ./libz.so.1 "fiif [ "$os_machine" = "loongarch64" ] || [ "$os_machine" = "mips64" ]; thenecho loongarch64 branchpreload_libs="${preload_libs} ./libffi.so.6.0.4 "fios_ver=`cat /etc/os-release | grep juniper`if [ ! -z "${os_ver}" ]; thenecho ${os_ver}preload_libs="${preload_libs} ./libstdc++.so.6 "fi
elseecho ${os_name} branchif [ "${libc_lower}" = "true" ]; thenecho ${os_name} glibc lower branch preload_libs="./envlib.so "fi
fiis_enable_cef109=true
if [ "${is_enable_cef109}" = "true" ]; thenif [ "$os_machine" = "aarch64" ]; thenif [ "${libc_lower_29}" = "true" ]; thenpreload_libs="${preload_libs} ./libm-2.31.so "fifipreload_libs="${preload_libs} ./plugins/dtwebview/libcef.so "
else
if [ "$os_machine" = "mips64" ]; thenecho mips64el branchpreload_libs="${preload_libs} ./plugins/dtwebview/libcef.so "
fi
fi# preload_libs
echo preload_libs=${preload_libs}
if [ ! -z "${preload_libs}" ]; thenLD_PRELOAD="${preload_libs}" ./com.alibabainc.dingtalk $1
else./com.alibabainc.dingtalk $1
fi
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files$
在上述文件中,我们看到,这里依据不同的硬件架构与操作系统环境调整了一下动态链接库的加载,并且解开了第二个疑团,那就是上面提到的./libgbm.so、./libstdc++.so.6在目录7.6.45-Release.5032501中。
libgbm.so不存在
接下来,我们看看如何解决./libgbm.so不存在的问题。
libgbm是Mesa的GBM(Generic Buffer Management)库,通常用于Wayland或图形渲染,需通过系统包管理器安装。
sudo apt install libgbm-dev
安装后,libgbm.so 通常位于 目录/usr/lib/x86_64-linux-gnu,即:
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501$ ll /usr/lib/x86_64-linux-gnu/ |grep libgbm
lrwxrwxrwx 1 root root 11 Dec 16 2024 libgbm.so -> libgbm.so.1
lrwxrwxrwx 1 root root 15 Dec 16 2024 libgbm.so.1 -> libgbm.so.1.0.0
-rw-r--r-- 1 root root 64656 Dec 16 2024 libgbm.so.1.0.0
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501$
我们为文件在目录7.6.45-Release.5032501中做一个软链接
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501$ sudo ln -s /usr/lib/x86_64-linux-gnu/libgbm.so ./libgbm.so
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501$ ll libgbm.so
lrwxrwxrwx 1 root root 35 Jun 21 15:23 libgbm.so -> /usr/lib/x86_64-linux-gnu/libgbm.so
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501$
GLIBCXX版本
接一下为,我们看看如何解决GLIBCXX版本问题。
我们先来查看一下目录7.6.45-Release.5032501中libstdc++.so.6的GLIBCXX版本:
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501$ strings libstdc++.so.6 |grep LIBCXX
GLIBCXX_DEBUG_MESSAGE_LENGTH
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501$
果然如此,我们再来看一下系统库(目录/usr/lib/x86_64-linux-gnu/)中libstdc++.so.6的GLIBCXX版本。
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501$ strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 |grep LIBCXX
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBCXX_3.4.23
GLIBCXX_3.4.24
GLIBCXX_3.4.25
GLIBCXX_3.4.26
GLIBCXX_3.4.27
GLIBCXX_3.4.28
GLIBCXX_3.4.29
GLIBCXX_3.4.30
GLIBCXX_3.4.31
GLIBCXX_3.4.32
GLIBCXX_3.4.33
GLIBCXX_TUNABLES
GLIBCXX_DEBUG_MESSAGE_LENGTH
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501$
如此以来,我们只需要将目录7.6.45-Release.5032501中的libstdc++.so.6删除,为系统库中的ibstdc++.so.6在目录7.6.45-Release.5032501建立一个软链接即可。
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501$ ll |grep libstdc++.so.6
-rw-r--r-- 1 root root 1874632 Mar 25 11:42 libstdc++.so.6
-rw-r--r-- 1 root root 1874632 Mar 25 11:42 libstdc++.so.6.0.25
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501$ sudo rm -rf libstdc++.so.6
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501$ sudo rm -rf libstdc++.so.6.0.25
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501$ sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 ./libstdc++.so.6
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501$ ll libstdc++.so.6
lrwxrwxrwx 1 root root 40 Jun 21 15:18 libstdc++.so.6 -> /usr/lib/x86_64-linux-gnu/libstdc++.so.6
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501$
如此以来,基本上就没什么大的问题了,我们来尝试一下。
lwk@qwfys:/opt/apps/com.alibabainc.dingtalk/files$ ./Elevator.sh
linuxmint
linuxmint branch
preload_libs=./libgbm.so ./plugins/dtwebview/libcef.so
Run Main is_gpu=0 is_zygote=0 is_render=0 is_crashpad_handler=0 cmd : ./com.alibabainc.dingtalk
[2025/06/21 17:46:08:INFO:app_channel.cpp(61)] AppChannelgetRealmI18nPolicyResourceContent read error
[23465:23465:2025/06/21 17:46:08:INFO:sync_module_impl.cc(24)] [Sync_module]ModuleMount
[23465:23465:2025/06/21 17:46:08:INFO:contact_module_impl.cc(33)] [contact_module] ModuleMount
[INFO:nest_service_manager_impl.cc(14)] NestServiceManager construct, this:0x5c1824031cc0
[INFO:nest_engine_ex.cc(43)] NestEngineEx constructed, git hash=#NEST_COMMIT_HASH_CODE_7e7fbc427c4fc0cca905603d5040aa9372f5c1
[WARNING:nest_engine_ex.cc(259)] nest engine already exist.
[23465:23465:2025/06/21 17:46:08:INFO:dt_nest_log_handler.cc(25)] [dt_nest] [INFO:nest_engine_impl.cc(71)] NestEngineImpl::PreInit[23465:23465:2025/06/21 17:46:08:INFO:dt_nest_log_handler.cc(25)] [dt_nest] [INFO:thread.cc(64)] thread:nest.biz.0.kDefault started[23465:23465:2025/06/21 17:46:08:INFO:dt_nest_log_handler.cc(25)] [dt_nest] [INFO:thread.cc(64)] thread:nest.biz.1.kHigh started[23465:23465:2025/06/21 17:46:08:INFO:dt_nest_log_handler.cc(25)] [dt_nest] [INFO:thread.cc(64)] thread:nest.biz.2.kLow started[23465:23465:2025/06/21 17:46:08:INFO:dt_nest_log_handler.cc(25)] [dt_nest] [INFO:thread.cc(64)] thread:nest.biz.3. started[23465:23465:2025/06/21 17:46:08:INFO:dt_nest_log_handler.cc(25)] [dt_nest] [INFO:nest_thread_service_impl.cc(56)] thread service...started[23465:23465:2025/06/21 17:46:08:INFO:dt_nest_log_handler.cc(25)] [dt_nest] [INFO:nest_engine_impl.cc(121)] InitGlobalManager[23465:23465:2025/06/21 17:46:08:INFO:dt_nest_log_handler.cc(25)] [dt_nest] [INFO:nest_manager_impl.cc(25)] NestManagerImpl construct, uid=-1, this:0x5c182403d3a0[23465:23465:2025/06/21 17:46:08:INFO:dt_foundation_initializer.cpp(109)] NestEngine::CreateNestEngine and InitThread

这里,我们看到,问题完美解决。
小结
我们在这里尝试着解决了钉钉Linux客户端在Linux mint上的安装问题,有时候能解决一些问题,一方面良好的分析问题、解决问题的思路对于问题的解决有着不可或缺的作用,另一方面,其实还是要看运气,如果我们碰到的问题不是足够复杂,恰好我们又在这个行业里头有一些深耕,那么问题解决起来就相对容易一些,如果遇到的问题相当复杂或者比较偏,没有任何的参考资料,也找不到可以探讨的人,这个时候,可能就会陷入问题的沼泽一时半会走不出来。
