我有一个Cython扩展,我已经在Ubuntu 14上编译并上传为Anaconda包。我试图在另一台运行Scientific Linux(6?)的机器上安装该软件包,该机器附带了旧版本的glibc。当我尝试导入模块时,我得到一个看起来像这样的错误:
./myprogram: /lib/libc.so.6: version `GLIBC_2.14' not found (required by ./myprogram)
当我说"类似" - " myprogram"实际上是扩展名的.so名称。
据我所知,这个错误是因为我在构建系统上有一个更新版本的glibc,它有memcpy
函数的更新版本。
此页面对问题有一个很好的描述,以及一些相当不切实际的解决方案:http://www.lightofdawn.org/wiki/wiki.cgi/NewAppsOnOldGlibc
这里提出了一个更简单的答案:How can I link to a specific glibc version?
我的问题是:如何将此解决方案应用于我的Cython扩展程序?假设__asm__
解决方案有效(如第二个链接中所示)什么是将其插入Cython生成的C的最佳方法?
另外,更一般地说,如何让其他模块首先避免这个问题?例如,我安装并运行了预先构建的numpy副本,没有任何问题。
答案 0 :(得分:0)
事实证明这很简单。
创建以下标题 glibc_fix.h :
<parent>
然后使用
__asm__(".symver memcpy,memcpy@GLIBC_2.2.5")
加入它。这可以设置为环境变量,或在CFLAGS="-include glibc_fix.h"
中定义。
此外,事实证明numpy在这方面没有做任何特别的事情。如果我自己编译它,它会链接到我系统上的新版本。