我正在将命令行应用程序从 Windows 移植到 Linux。此应用程序使用了一些第三方闭源库。
使用一个这样的库(带有.so文件)我得到了许多链接器错误:
3rdparty.so: undefined reference to `sem_getvalue@GLIBC_2.34'
3rdparty.so: undefined reference to `pthread_create@GLIBC_2.34'
3rdparty.so: undefined reference to `lstat@GLIBC_2.33'
3rdparty.so: undefined reference to `sem_close@GLIBC_2.34'
3rdparty.so: undefined reference to `dlclose@GLIBC_2.34'
3rdparty.so: undefined reference to `dlsym@GLIBC_2.34'
3rdparty.so: undefined reference to `sem_open@GLIBC_2.34'
3rdparty.so: undefined reference to `sem_trywait@GLIBC_2.34'
3rdparty.so: undefined reference to `pthread_setspecific@GLIBC_2.34'
3rdparty.so: undefined reference to `dlopen@GLIBC_2.34'
3rdparty.so: undefined reference to `dlerror@GLIBC_2.34'
3rdparty.so: undefined reference to `pthread_getspecific@GLIBC_2.34'
3rdparty.so: undefined reference to `sem_init@GLIBC_2.34'
3rdparty.so: undefined reference to `sem_destroy@GLIBC_2.34'
3rdparty.so: undefined reference to `pthread_join@GLIBC_2.34'
3rdparty.so: undefined reference to `sem_post@GLIBC_2.34'
3rdparty.so: undefined reference to `stat@GLIBC_2.33'
3rdparty.so: undefined reference to `fstat@GLIBC_2.33'
3rdparty.so: undefined reference to `pthread_once@GLIBC_2.34'
3rdparty.so: undefined reference to `sem_wait@GLIBC_2.34'
3rdparty.so: undefined reference to `pthread_key_create@GLIBC_2.34'
这里的问题不是缺少 ie pthreads。它已在主应用程序本身中使用并成功链接。如果我省略 3rdparty.so,程序将使用 pthreads 等进行链接和运行。
看来 3rdparty.so 是使用版本 2.33 和 2.34 链接的(可能是通过一些外部依赖项)。
因此我尝试按照此处所述分别下载并构建这些版本:如何在 Ubuntu 20.04 上获取 glibc 2.35? 我成功构建了这些库,甚至能够链接它们,但随后出现其他链接错误。
解决这个问题的正确方法是什么?
环境:gcc版本9.4.0(Ubuntu 9.4.0-1ubuntu1~20.04.2)
Eclipse 版本:2021-12 (4.22.0) 构建编号:20211202-1639
答案1
从第三方供应商处我得到了以下建议:
SDK 已在 Ubuntu 22.04 上编译,需要至少 2.34 版的 glibc。...遗憾的是,您机器上的 gcc/glibc/Linux 版本太旧了。不幸的是,这意味着您必须升级到较新的 Ubuntu 版本(即至少 Ubuntu 22.04)。
我认为这澄清了问题。