文章目录
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 *


5249

被折叠的 条评论
为什么被折叠?



