One possibility: file ‘/opt/gflags/src/gflags.cc‘ is being linked both statically and dynamically ..



1.问题描述

在编译SLAM时遇到以下问题

ERROR: something wrong with flag 'flagfile' in file '/opt/gflags/src/gflags.cc'.  One possibility: file '/opt/gflags/src/gflags.cc' is being linked both statically and dynamically into this executable.

报错显示可能是 gflags 库被同时静态和动态链接了,导致冲突。重新编译 gflags 并确保只使用静态或动态库,这里只保留了动态库。

2.重新编译 gflags 和 glog

# 进入 gflags 源代码目录:
cd /path/to/gflags		
mkdir build && cd build
# 创建构建目录并配置只生成动态库:
cmake .. -DBUILD_SHARED_LIBS=ON
# 安装:
make -j$(nproc)
sudo make install
# 更新动态链接库缓存
sudo ldconfig
# 确保链接的 gflags 库都是动态的,而不是混合静态和动态。
# 进入 glog 源代码目录:
cd /path/to/glog
mkdir build && cd build
# 创建构建目录并配置只生成动态库:
cmake .. -DBUILD_SHARED_LIBS=ON
# 安装:
make -j$(nproc)
sudo make install
# 更新动态链接库缓存
sudo ldconfig

# 确保链接的 gflags 库都是动态的,而不是混合静态和动态。

检查 LD_LIBRARY_PATH:

确保 LD_LIBRARY_PATH 包含动态库路径

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

查看结果

echo $LD_LIBRARY_PATH

3.注意,上面若不行,再重新编译下Ceres 及 opencv

卸载ceres

xx@xx-virtual-machine:find /usr/local/ -name '*ceres*'
/usr/local/include/ceres
/usr/local/include/ceres/ceres.h
/usr/local/lib/libceres.so.1
/usr/local/lib/libceres.so.1.14.0
/usr/local/lib/libceres.so

安装ceres

cd Ceres/build
# -DBUILD_SHARED_LIBS=ON : CMake 生成动态链接库(shared libraries),而不是生成静态链接库(static libraries
cmake .. -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
sudo make install

find /usr/local/lib /usr/lib -name “libgflags*.a”

/usr/lib/x86_64-linux-gnu/libgflags_nothreads.a
/usr/lib/x86_64-linux-gnu/libgflags.a

4.安装opencv (这个必须要仅动态)

virtual-machine:/opt/opencv-3.4.15/build$ sudo rm -fr *

cmake -D CMAKE_BUILD_TYPE=Release \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D OPENCV_EXTRA_MODULES_PATH=../opencv_contrib-3.4.15/modules \
      -D WITH_CUDA=OFF \
      -D BUILD_SHARED_LIBS=ON \
      ..
 # BUILD_SHARED_LIBS=ON  确保 OpenCV 仅构建和链接动态库,可以将 -DBUILD_SHARED_LIBS=ON 添加到命令中

编译 OpenCV: 使用以下命令编译:

make -j$(nproc)

安装 OpenCV: 完成编译后,运行以下命令安装:

sudo make install
sudo ldconfig

4.卸载 gflags 和 gflog

4.1.首先,通过 find 命令找到安装路径,然后手动删除相关文件:

# 找到 gflags 的安装路径
xx@xx-virtual-machine: find /usr/local/lib /usr/lib -name "libgflags*"
/usr/local/lib/libgflags.so.2.2
/usr/local/lib/libgflags.so.2.2.2
/usr/local/lib/libgflags_nothreads.so.2.2.2
/usr/local/lib/libgflags_nothreads.so.2.2
/usr/local/lib/libgflags.so
/usr/local/lib/libgflags_nothreads.so
/usr/lib/x86_64-linux-gnu/libgflags.so.2.2
/usr/lib/x86_64-linux-gnu/libgflags.so.2.2.2
/usr/lib/x86_64-linux-gnu/libgflags_nothreads.so.2.2.2
/usr/lib/x86_64-linux-gnu/libgflags_nothreads.so.2.2
/usr/lib/x86_64-linux-gnu/libgflags.so
/usr/lib/x86_64-linux-gnu/libgflags_nothreads.so
# 删除相关文件  直接复制运行
sudo rm /usr/local/lib/libgflags.so.2.2
sudo rm /usr/local/lib/libgflags.so.2.2.2
sudo rm /usr/local/lib/libgflags_nothreads.so.2.2.2
sudo rm /usr/local/lib/libgflags_nothreads.so.2.2
sudo rm /usr/local/lib/libgflags.so
sudo rm /usr/local/lib/libgflags_nothreads.so
sudo rm /usr/lib/x86_64-linux-gnu/libgflags.so.2.2
sudo rm /usr/lib/x86_64-linux-gnu/libgflags.so.2.2.2
sudo rm /usr/lib/x86_64-linux-gnu/libgflags_nothreads.so.2.2.2
sudo rm /usr/lib/x86_64-linux-gnu/libgflags_nothreads.so.2.2
sudo rm /usr/lib/x86_64-linux-gnu/libgflags.so
sudo rm /usr/lib/x86_64-linux-gnu/libgflags_nothreads.so
# 找到 glog 的安装路径
xx@xx-virtual-machine: find /usr/local/lib /usr/lib -name "libglog*"
/usr/local/lib/libglog.so.0.4.0
/usr/local/lib/libglog.so
/usr/local/lib/libglog.so.0
/usr/lib/x86_64-linux-gnu/libglog.so
/usr/lib/x86_64-linux-gnu/libglog.a
/usr/lib/x86_64-linux-gnu/libglog.so.0.0.0
/usr/lib/x86_64-linux-gnu/pkgconfig/libglog.pc
/usr/lib/x86_64-linux-gnu/libglog.so.0
# 删除相关文件  直接复制运行
sudo rm /usr/local/lib/libglog.so.0.4.0
sudo rm /usr/local/lib/libglog.so
sudo rm /usr/local/lib/libglog.so.0
sudo rm /usr/lib/x86_64-linux-gnu/libglog.so
sudo rm /usr/lib/x86_64-linux-gnu/libglog.a
sudo rm /usr/lib/x86_64-linux-gnu/libglog.so.0.0.0
sudo rm /usr/lib/x86_64-linux-gnu/libglog.so.0
sudo rm /usr/lib/x86_64-linux-gnu/pkgconfig/libglog.pc

4.2.更新共享库缓存

删除库文件后,需要更新共享库缓存以确保系统加载的库是最新的:

sudo ldconfig

4.3.清理 CMake 缓存

为避免编译项目时继续使用旧版本的 gflags 和 glog,请在项目目录中清理 CMake 缓存:

cd /path/to/your/project/build
rm -rf *

5.参考

Vins-Fusion安装过程中遇到的有关gflag的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草莓奶忻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值