Ubuntu 21环境下CMake运行C++代码时librocksdb.so.6.12共享库缺失问题求助
解决Ubuntu 21下RocksDB版本不匹配的动态链接错误
我完全懂你这种对着编译器报错抓耳挠腮的感觉——明明装了库,却死活找不到对应版本,太闹心了!咱们先把问题拆明白,再一步步解决:
错误原因分析
你遇到的error while loading shared libraries: librocksdb.so.6.12: cannot open shared object file本质是动态链接版本不匹配:你的程序(或者它依赖的某个第三方库)是针对RocksDB 6.12编译的,但你通过apt安装的系统版本是6.11.4,动态链接器找不到对应版本的共享库文件,自然就报错了。
一步步解决方案
1. 先定位“谁在找6.12版本”
首先搞清楚是你的代码本身依赖6.12,还是某个依赖库带的需求。用ldd命令检查你的可执行文件:
ldd ./your_compiled_executable | grep rocksdb
输出会显示当前程序依赖的RocksDB版本,以及找不到的库路径,帮你精准定位问题根源。
2. 方案一:升级RocksDB到6.12版本(推荐)
Ubuntu 21的官方apt仓库里RocksDB版本是6.11,所以得手动从源码编译安装6.12:
- 先卸载现有apt安装的RocksDB:
sudo apt purge librocksdb-dev librocksdb6.11 sudo apt autoremove - 克隆RocksDB 6.12的稳定分支源码:
git clone --branch v6.12.6 https://github.com/facebook/rocksdb.git cd rocksdb - 编译并安装共享库:
make shared_lib -j$(nproc) # -j后接CPU核心数,加速编译 sudo make install-shared # 安装共享库到/usr/local/lib sudo ldconfig # 更新动态链接器缓存 - 验证安装结果:
你应该能看到ls -l /usr/local/lib/librocksdb*librocksdb.so.6.12相关的文件,动态链接器会优先搜索/usr/local/lib路径,之后再运行程序应该就能找到对应库了。
3. 方案二:让程序适配系统的6.11.4版本
如果不想升级RocksDB,就需要让你的代码和编译配置适配现有版本:
- 检查CMake配置:如果你的
CMakeLists.txt里硬编码了版本要求(比如find_package(RocksDB 6.12 REQUIRED)),改成不指定版本或者指定6.11:find_package(RocksDB REQUIRED) # 或者明确指定版本 find_package(RocksDB 6.11 REQUIRED) - 清理旧编译产物:之前可能已经用6.12的配置编译过,所以要彻底清理build目录再重新编译:
rm -rf build mkdir build && cd build cmake .. && make - 检查第三方依赖:如果是你链接的某个预编译第三方库依赖6.12,那要么换该库的兼容版本,要么还是得升级RocksDB(长期来看更稳妥)。
4. 临时 workaround:创建软链接(不推荐长期使用)
如果只是临时测试,可以通过软链接让系统“假装”有6.12版本的库:
sudo ln -s /lib/librocksdb.so.6.11.4 /lib/librocksdb.so.6.12 sudo ldconfig
⚠️ 注意:这个方法只是绕过了链接错误,RocksDB不同小版本之间可能存在API差异,运行时可能出现未知bug,只适合临时调试用。
为什么你之前的方法没生效?
- 从源码编译时没指定
shared_lib参数:默认make会生成静态库,不会生成动态库,所以你看不到librocksdb.so.6.12; - 旧编译产物没清理:即使修改了CMake配置,旧的可执行文件还是依赖6.12,所以必须彻底删除build目录重新编译;
- 软链接没更新缓存:创建软链接后必须运行
sudo ldconfig,不然动态链接器不会识别新的链接。
内容的提问来源于stack exchange,提问作者squishyvariably
相关产品推荐
相关产品推荐

