MacOS使用matplotlib-cpp编译运行提示libpython3.9.dylib加载失败
MacOS下matplotlib-cpp编译后运行找不到libpython3.9.dylib的合规解决方案
问题复现
在本地MacBook设备部署matplotlib-cpp后,使用如下g++命令编译示例代码验证库功能:
g++ test.cpp -std=c++17 \ -I /Users/pangkachun/matplotlib-cpp \ -I /Users/pangkachun/miniforge3/include/python3.9 \ -I /Users/pangkachun/miniforge3/lib/python3.9/site-packages/numpy/core/include \ -L /Users/pangkachun/miniforge3/lib \ -lpython3.9 \ -o plot
编译无报错,但执行生成的./plot可执行文件时终端返回如下错误:
dyld[47656]: Library not loaded: @rpath/libpython3.9.dylib Referenced from: /Users/pangkachun/plot Reason: tried: '/usr/local/lib/libpython3.9.dylib' (no such file), '/usr/lib/libpython3.9.dylib' (no such file) zsh: abort ./plot
错误本质是动态链接器dyld未在默认检索路径下找到libpython3.9.dylib动态库,先后查找/usr/local/lib、/usr/lib路径均无对应文件,程序触发abort信号中止。
临时方案验证:手动创建
/usrlocal/lib目录,将miniforge3/lib路径下的对应动态库通过符号链接关联到该目录下可让程序正常运行,但该方式不符合系统规范,需要更通用的无侵入解决方案。
常规合规解决方案
方案1:编译时写入rpath(推荐,无副作用)
不需要修改系统目录、不需要设置全局配置,只需要在原有编译命令中新增rpath参数,把miniforge3的动态库路径直接写入可执行文件的加载信息,dyld运行时会自动到该路径查找依赖,修改后的编译命令如下:
g++ test.cpp -std=c++17 \ -I /Users/pangkachun/matplotlib-cpp \ -I /Users/pangkachun/miniforge3/include/python3.9 \ -I /Users/pangkachun/miniforge3/lib/python3.9/site-packages/numpy/core/include \ -L /Users/pangkachun/miniforge3/lib \ -lpython3.9 \ -Wl,-rpath,/Users/pangkachun/miniforge3/lib \ -o plot
参数说明:
-Wl,是g++的传参前缀,代表后续内容传递给底层链接器处理-rpath指定的路径会被固化到生成的可执行文件中,仅对当前程序生效,不会影响其他软件的依赖加载,是动态库链接的标准做法。
方案2:临时设置当前终端的动态库查找路径
如果不想修改编译命令,可在执行程序前临时给当前shell会话设置动态库查找路径,仅对当前终端窗口生效,关闭终端后配置自动失效:
export DYLD_LIBRARY_PATH=/Users/pangkachun/miniforge3/lib:$DYLD_LIBRARY_PATH ./plot
注意:不建议把上述export命令写入.zshrc/.bash_profile等shell配置文件做全局生效,全局修改动态库查找路径可能导致其他程序加载到错误版本的依赖库,触发兼容性问题。
内容的提问来源于stack exchange,提问作者Ricky Pang
相关产品推荐
相关产品推荐

