基于CMake+vcpkg的C++应用在oneAPI Ubuntu Docker中找不到libtbb.so.12
根本原因
你在交互式Shell中执行ldd能正常解析库路径,是因为当前Shell环境中加载了LD_LIBRARY_PATH配置。但你通过Visual Studio远程执行程序时,使用的是非交互Shell,不会加载用户环境变量配置,因此无法识别oneTBB的库路径。
可行解决方案
方案1:修改Visual Studio启动配置(最推荐,无需修改容器配置)
在CMake项目的launch.vs.json调试配置文件中,新增环境变量配置,指定oneTBB库路径:
{ "configurations": [ { "type": "cppgdb", "name": "main", "project": "CMakeLists.txt", "projectTarget": "main", "env": { "LD_LIBRARY_PATH": "/opt/intel/oneapi/tbb/latest/lib/intel64/gcc4.8:${LD_LIBRARY_PATH}" } } ] }
修改后重新启动调试即可生效。
方案2:将oneTBB路径加入系统动态链接器配置(永久生效)
修改Dockerfile,添加如下配置,将oneTBB库路径加入系统动态链接库搜索列表:
# 新增oneTBB库路径到系统动态链接配置 RUN echo "/opt/intel/oneapi/tbb/latest/lib/intel64/gcc4.8" > /etc/ld.so.conf.d/oneapi-tbb.conf \ && ldconfig
重新构建镜像后启动容器,无需额外配置即可正常运行程序。
方案3:启动程序前加载oneAPI环境脚本
手动执行程序前,先运行oneAPI官方环境初始化脚本加载所有环境变量:
. /opt/intel/oneapi/setvars.sh ./main
如果需要在Visual Studio中使用该方案,可修改启动命令为:
bash -c ". /opt/intel/oneapi/setvars.sh && ./main"
补充说明
你之前将libtbb.so.12拷贝到/usr/lib后未生效,是因为没有执行ldconfig命令刷新动态链接器缓存,执行该命令后该方法也可生效,但直接修改系统库目录的方式不推荐,容易引发版本冲突。
内容的提问来源于stack exchange,提问作者Sergey Trushkov
相关产品推荐
相关产品推荐

