我正在使用AlpineLinux(安装在我的计算机上,而不是安装在docker中(,我正在尝试使用一个依赖于glibc的共享库。
由于Glibc没有集成到这个发行版中,我看到开发了一个替代方案gcompat
,以提供与为Glibc构建的程序的兼容性。
我想使用的库是IDS Imaging的驱动程序(用于他们的相机(。当使用CDLL
(从python脚本(动态加载.so
时,它将失败。
在这次失败之后,我运行ldd libueye_api.so
来检查是否找到了所有的依赖项,我得到了:
/lib/ld-musl-x86_64.so.1 (0x7fb685c50000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7fb684d93000)
librt.so.1 => /lib/ld-musl-x86_64.so.1 (0x7fb685c50000)
libdl.so.2 => /lib/ld-musl-x86_64.so.1 (0x7fb685c50000)
libpthread.so.0 => /lib/ld-musl-x86_64.so.1 (0x7fb685c50000)
libgomp.so.1 => /usr/lib/libgomp.so.1 (0x7fb684d51000)
libm.so.6 => /lib/ld-musl-x86_64.so.1 (0x7fb685c50000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7fb684d38000)
libc.so.6 => /lib/ld-musl-x86_64.so.1 (0x7fb685c50000)
ld-linux-x86-64.so.2 => /lib/ld-linux-x86-64.so.2 (0x7fb684d32000)
Error relocating libueye_api.so: __pthread_register_cancel: symbol not found
Error relocating libueye_api.so: __pthread_unregister_cancel: symbol not found
在这个日志中,我看到musl和gcompat被成功找到,但__pthread_register_cancel
和__pthread_unregister_cancel
没有找到。。。
有人有办法解决这个问题吗?
AlpineLinux有一个wiki,描述了运行需要GLIBC的应用程序的4种替代方案。
https://wiki.alpinelinux.org/wiki/Running_glibc_programs
其中一个选项是使用社区贡献的gcompat包。APK包、说明和其他详细信息在pkgs页面上
https://pkgs.alpinelinux.org/packages?name=gcompat&branch=edge&repo=社区&arch=x86_64
在APKBUILD文件中,它显示了源代码的来源,并且compat-lib中的pthread没有__pthread_register_cancel。在您的stacktrace中,我没有看到任何对/lib/libgcompat.so.0的引用,所以可能仍然需要通过运行ldconfig来找到库,但我认为gcompat并不包含所有pthread方法。它只是不在代码中
https://git.adelielinux.org/adelie/gcompat/-/blob/current/libgcompat/pthread.c
我隐约记得我曾经在AlpineLinux中安装过GLIBC软件包,但那可能只是我疯狂的梦想之一,我在存储库中找不到这样的软件包
我发现的是Sasha Gerrand的APK和Docker镜像,他为AlpineLinux创建了一个完整的GLIBC 2.34库。如果你安装了APK软件包或使用Docker镜像,你应该有一个完整的glibc在AlpineLinux上运行。
https://github.com/sgerrand/alpine-pkg-glibc
就我个人而言,我会尽量避免运行依赖于库的应用程序,但我知道有时切换到更灵活的应用程序不是一种选择。