Anaconda3 Cython编译报错:gcc无法找到-lpthread与-lc
我之前在旧版Ubuntu搭配Anaconda的环境里也碰到过几乎一模一样的问题,咱们来一步步拆解解决:
问题根源
你遇到的报错核心原因是Anaconda自带的链接器和Xubuntu 16.04的系统库环境不兼容。Anaconda为了实现跨平台编译,在compiler_compat目录下打包了一套自己的工具链,但这套工具链在Ubuntu 16.04这种相对老旧的系统上,没办法正确定位libpthread.so、libc.so这些系统级核心库,所以链接阶段直接报错找不到-lpthread和-lc。
你说单独执行编译命令正常、只有链接命令失败,也完全符合这个逻辑——编译阶段用的gcc没问题,但链接时调用了Anaconda的ld,才出的问题。
具体解决方案
方案1:临时切换到系统原生链接器(快速验证)
在执行setup.py之前,先把系统默认的/usr/bin放到环境变量最前面,让系统优先用原生的链接器:
export PATH=/usr/bin:$PATH python setup.py build_ext --inplace
这个方法最简单,适合快速验证问题,用完之后如果不需要可以直接关闭终端,环境变量就恢复了。
方案2:永久替换Anaconda的链接器
如果不想每次都手动设置环境变量,可以直接把Anaconda的ld换成系统原生版本的软链接:
- 先备份Anaconda自带的ld:
mv /home/j/OFFICIAL/anaconda3/compiler_compat/ld /home/j/OFFICIAL/anaconda3/compiler_compat/ld_backup
- 创建指向系统ld的软链接:
ln -s /usr/bin/ld /home/j/OFFICIAL/anaconda3/compiler_compat/ld
这样以后不管什么时候执行Cython编译,都会自动用系统的链接器,一劳永逸。
方案3:在setup.py里指定链接器(更灵活)
如果你不想修改系统或Anaconda的全局配置,也可以在你的setup.py里直接指定链接器路径:
from setuptools import setup from Cython.Build import cythonize from setuptools.command.build_ext import build_ext class CustomBuildExt(build_ext): def build_extensions(self): # 强制使用系统原生的ld链接器 self.compiler.set_executable('linker_so', '/usr/bin/ld') super().build_extensions(self) setup( ext_modules=cythonize("your_module.pyx"), # 替换成你的pyx文件名 cmdclass={'build_ext': CustomBuildExt} )
修改完setup.py后,再运行python setup.py build_ext --inplace就可以正常链接了。
验证方法
你可以把之前报错的链接命令单独拿出来,在执行完方案1的环境变量设置后运行,应该能成功找到-lpthread和-lc,顺利完成链接。
内容的提问来源于stack exchange,提问作者Jonatan Öström

