MultiNEAT Python程序出现未定义符号错误的原因及修复方案
问题:MultiNEAT导入时出现未定义符号错误
我尝试运行《Hands-on-Neuroevolution-with-Python》书籍中Chapter8的retina_experiment.py程序,用conda搭建了名为rt_multineat的环境,环境配置命令如下:
conda create --name rt_multineat python=3.5 boost=1.67 matplotlib=2.2 numpy=1.11 opencv=3.3 conda activate rt_multineat conda install -c conda-forge multineat conda install -c anaconda seaborn conda install graphviz conda install python-graphviz
执行程序时触发ImportError,错误信息如下:
python retina_experiment.py -t 1 -g 1000 Traceback (most recent call last): File "retina_experiment.py", line 19, in <module> import MultiNEAT as NEAT File "/home/user/anaconda3/envs/rt_multineat/lib/python3.5/site-packages/MultiNEAT/__init__.py", line 3, in <module> from ._MultiNEAT import * ImportError: /home/user/anaconda3/envs/rt_multineat/lib/python3.5/site-packages/MultiNEAT/_MultiNEAT.cpython-35m-x86_64-linux-gnu.so: undefined symbol: _ZN5boost7archive18text_oarchive_implINS0_13text_oarchiveEE4saveERKSs
我也尝试过用python=3.6创建环境,结果一致。请问该未定义符号错误的成因是什么?能否修复?
成因与修复方案
成因
这个错误是MultiNEAT预编译包与你手动指定的Boost版本不兼容导致的:
- 错误中的符号属于Boost.Serialization模块,是MultiNEAT核心依赖组件
- conda-forge提供的MultiNEAT包是用特定版本Boost编译的,你强制指定
boost=1.67后,两者版本不匹配,动态链接时找不到对应符号
修复方案
方案1:让conda自动匹配兼容依赖(推荐)
- 删除现有环境:
conda remove --name rt_multineat --all
- 重建环境时不手动指定Boost版本,由conda根据MultiNEAT的依赖要求自动安装匹配版本:
conda create --name rt_multineat python=3.5 matplotlib=2.2 numpy=1.11 opencv=3.3 conda activate rt_multineat conda install -c conda-forge multineat conda install -c anaconda seaborn conda install graphviz python-graphviz
方案2:从源码编译MultiNEAT(适合需固定Boost版本的场景)
- 确保现有环境已安装编译依赖:
conda activate rt_multineat conda install cmake git boost=1.67 boost-cpp=1.67 python=3.5 numpy=1.11
- 克隆源码并编译安装:
git clone https://github.com/peter-ch/MultiNEAT.git cd MultiNEAT mkdir build && cd build cmake .. -DPYTHON_EXECUTABLE=$(which python) -DCMAKE_BUILD_TYPE=Release make install
编译完成后重新运行程序即可。
内容的提问来源于stack exchange,提问作者Helena
相关产品推荐
相关产品推荐

