C嵌入Anaconda Python3.9运行提示找不到libpython3.9.so.1.0
问题描述
- 编写了调用Python逻辑的C脚本,大部分功能调试正常,运行编译生成的可执行文件时报错:
~/Documents/code/test: error while loading shared libraries: libpython3.9.so.1.0: cannot open shared object file: No such file or directory [1] + Done "/usr/bin/gdb" --interpreter=mi --tty=${DbgTerm} 0<"/tmp/Microsoft-MIEngine-In-cdpcz1c5.vwd" 1>"/tmp/Microsoft-MIEngine-Out-j5b1thxt.2vz"
- 开发环境为VS Code,使用的
tasks.json配置如下:
{ "tasks": [ { "type": "cppbuild", "label": "C/C++: gcc build active file", "command": "/usr/bin/gcc", "args": [ "-fdiagnostics-color=always", "-I${workspaceFolder}", "-I/usr/include/glib-2.0", "-I/usr/lib/x86_64-linux-gnu/glib-2.0/include", "-I${HOME}/anaconda3/envs/metagenomics/include", "-I${HOME}/anaconda3/envs/metagenomics/include/python3.9", "-I${HOME}/anaconda3/envs/metagenomics/lib/python3.9/site-packages/numpy/core/include/numpy", "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}", "-L${HOME}/anaconda3/envs/metagenomics/lib", "-L${HOME}/anaconda3/envs/metagenomics/lib/python3.9", "-L${HOME}/anaconda3/envs/metagenomics/lib/python3.9/config-3.9-x86_64-linux-gnu", "-lpython3.9" ], "options": { "cwd": "${fileDirname}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "Task generated by Debugger." } ], "version": "2.0.0" }
- 实际执行的构建命令如下,构建可成功完成:
Starting build... /usr/bin/gcc -fdiagnostics-color=always -I${HOME}/Documents/code -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I${HOME}/anaconda3/envs/myenv/include -I${HOME}/anaconda3/envs/myenv/include/python3.9 -I${HOME}/anaconda3/envs/myenv/lib/python3.9/site-packages/numpy/core/include/numpy -g ${HOME}/Documents/code/test.c -o ${HOME}/Documents/code/test -L${HOME}/anaconda3/envs/myenv/lib -L${HOME}/anaconda3/envs/myenv/lib/python3.9 -L${HOME}/anaconda3/envs/myenv/lib/python3.9/config-3.9-x86_64-linux-gnu -lpython3.9 Build finished successfully.
- 已确认的排查信息:
- 使用Anaconda作为环境管理器,编译参数中已添加
${HOME}/anaconda3/envs/myenv/lib等库搜索路径 - 执行
find ~/anaconda3/envs/myenv/ -name libpython3.9.so.*可确认对应路径下存在libpython3.9.so.1.0文件 - 文件权限为
-rwxrwxr-x,不存在权限不足问题 - 参考过通用同类问题方案,未适配当前场景
- 使用Anaconda作为环境管理器,编译参数中已添加
故障原因
和权限无关。编译时添加的-L参数仅在编译链接阶段生效,不会把库搜索路径写入最终生成的可执行文件,程序运行时的动态链接器默认不会扫描Anaconda虚拟环境下的lib目录,自然无法定位到libpython3.9.so.1.0。
另外配置存在路径不一致问题:tasks.json中写的头文件、库路径指向metagenomics环境,实际执行的构建命令用的是myenv环境,后续容易出现版本不匹配问题,需要统一。
解决方案
任选以下一种方案即可:
方案1:编译时写入rpath(推荐,不依赖终端环境配置)
修改tasks.json的gcc参数,在链接参数中添加-Wl,-rpath,${HOME}/anaconda3/envs/myenv/lib,把库的绝对搜索路径直接写入可执行文件,运行时动态链接器会优先到该路径查找依赖。
修改后的链接部分参数参考:
"args": [ // 其余原有参数保留,注意统一所有路径到同一个conda环境 "-L${HOME}/anaconda3/envs/myenv/lib", "-L${HOME}/anaconda3/envs/myenv/lib/python3.9", "-L${HOME}/anaconda3/envs/myenv/lib/python3.9/config-3.9-x86_64-linux-gnu", "-Wl,-rpath,${HOME}/anaconda3/envs/myenv/lib", "-lpython3.9" ]
重新编译后即可正常运行。
方案2:运行前临时指定动态库路径
执行程序前在当前终端输入以下命令,把Anaconda环境的lib路径加入动态链接器搜索路径:
export LD_LIBRARY_PATH=~/anaconda3/envs/myenv/lib:$LD_LIBRARY_PATH
再执行编译好的二进制文件即可。该配置仅对当前终端会话生效,新开终端需要重新执行。
方案3:激活对应Anaconda环境后再运行
Anaconda激活虚拟环境时会自动把当前环境的lib路径加入LD_LIBRARY_PATH,先执行conda activate myenv激活编译时使用的虚拟环境,再运行程序即可正常加载依赖库。
内容的提问来源于stack exchange,提问作者CopyOfA
相关产品推荐
相关产品推荐

