记录一次ubuntu20.04 解决gmock not found问题的过程

发布于:2025-08-10 ⋅ 阅读:(18) ⋅ 点赞:(0)

在电脑上源码编译moveit,系统是ubuntu20.04,有三个电脑,分别叫做A,B,C好了,A和C都可以很顺畅地走流程编译通过,但是B遇到了gmock not found的问题,一开始没当回事,感觉重装下库,或者手动装一下就能解决,但是解决的过程还是走了一些弯路的,在这里记录一下。问题应该是由于之前手动安装的google-test可能没有开启gmock部分的编译安装?最后也不确定,先说一下最终的解决办法吧。

1. 使用到gmock报错的代码

在这里插入图片描述
这里会先使用add_rostest_gmock来生成一个测试的东西,然后把一些其他的库链到这个东西上面,但是会报错说找不到链接的目标,其实也就是生成的这个测试的文件

2. 最终办法

2.1 使用fdfind看一下电脑A和电脑B中和gmock有关的文件

这里需要进入到系统的根目录下,使用fdfind来看下系统中有哪些和gmock有关的文件,因为anaconda3其实也会有很多gmock等等的测试相关的库,但是我的这个编译和conda环境无关,所以需要使用grep管道来筛选掉一些我不需要看到的包含gmock关键字的文件,最终的命令和命令输出的结果如下所示,下面首先是电脑A(可以正常编译)的电脑的输出结果

fd gmock | grep -vE 'media|anaconda3|Downloads|Documents'
usr/src/gmock
usr/src/googletest/googlemock/src/gmock-spec-builders.cc
usr/src/googletest/googlemock/cmake/gmock_main.pc.in
usr/src/googletest/googlemock/src/gmock-matchers.cc
usr/src/googletest/googlemock/src/gmock-cardinalities.cc
usr/src/googletest/googlemock/src/gmock-all.cc
usr/src/googletest/googlemock/src/gmock-internal-utils.cc
usr/src/googletest/googlemock/src/gmock_main.cc
usr/src/googletest/googlemock/docs/gmock_faq.md
usr/src/googletest/googlemock/src/gmock.cc
usr/src/googletest/googlemock/cmake/gmock.pc.in
usr/src/googletest/googlemock/scripts/gmock-config.in
usr/src/googletest/googlemock/scripts/upload_gmock.py
usr/src/googletest/googlemock/scripts/fuse_gmock_files.py
usr/src/googletest/googlemock/scripts/gmock_doctor.py
usr/src/googletest/googlemock/test/gmock-pp-string_test.cc
usr/src/googletest/googlemock/test/gmock-nice-strict_test.cc
usr/src/googletest/googlemock/test/gmock-cardinalities_test.cc
usr/src/googletest/googlemock/test/gmock-generated-function-mockers_test.cc
usr/src/googletest/googlemock/test/gmock-spec-builders_test.cc
usr/src/googletest/googlemock/test/gmock_leak_test.py
usr/src/googletest/googlemock/test/gmock-function-mocker_nc_test.py
usr/src/googletest/googlemock/test/gmock-generated-matchers_test.cc
usr/src/googletest/googlemock/test/gmock_output_test.py
usr/src/googletest/googlemock/test/gmock-function-mocker_test.cc
usr/src/googletest/googlemock/test/gmock-actions_test.cc
usr/src/googletest/googlemock/test/gmock_test.cc
usr/src/googletest/googlemock/test/gmock_output_test_.cc
usr/src/googletest/googlemock/test/gmock-pp_test.cc
usr/src/googletest/googlemock/test/gmock_link_test.cc
usr/src/googletest/googlemock/test/gmock_leak_test_.cc
usr/src/googletest/googlemock/include/gmock
usr/src/googletest/googlemock/test/gmock_output_test_golden.txt
usr/src/googletest/googlemock/test/gmock_link2_test.cc
usr/src/googletest/googlemock/test/gmock-more-actions_test.cc
usr/src/googletest/googlemock/test/gmock_ex_test.cc
usr/src/googletest/googlemock/test/gmock-function-mocker_nc.cc
usr/src/googletest/googlemock/test/gmock-internal-utils_test.cc
usr/src/googletest/googlemock/test/gmock-generated-actions_test.cc
usr/src/googletest/googlemock/test/gmock-matchers_test.cc
usr/src/googletest/googlemock/test/gmock_stress_test.cc
usr/src/googletest/googlemock/test/gmock_test_utils.py
usr/src/googletest/googlemock/test/gmock_link_test.h
usr/src/googletest/googlemock/test/gmock-port_test.cc
usr/src/googletest/googlemock/test/gmock_all_test.cc
usr/src/googletest/googlemock/scripts/generator/gmock_gen.py
usr/src/googletest/googlemock/scripts/generator/gmock_gen
usr/src/googletest/googlemock/include/gmock/gmock-function-mocker.h
usr/src/googletest/googlemock/include/gmock/gmock-generated-function-mockers.h
usr/src/googletest/googlemock/include/gmock/gmock-generated-actions.h
usr/src/googletest/googlemock/include/gmock/gmock-generated-matchers.h.pump
usr/src/googletest/googlemock/include/gmock/gmock-generated-actions.h.pump
usr/src/googletest/googlemock/include/gmock/gmock-generated-matchers.h
usr/src/googletest/googlemock/include/gmock/gmock-actions.h
usr/src/googletest/googlemock/include/gmock/gmock-generated-function-mockers.h.pump
usr/src/googletest/googlemock/include/gmock/gmock-cardinalities.h
usr/src/googletest/googlemock/include/gmock/gmock-matchers.h
usr/src/googletest/googlemock/include/gmock/gmock-nice-strict.h
usr/src/googletest/googlemock/include/gmock/gmock-spec-builders.h
usr/src/googletest/googlemock/include/gmock/gmock-more-matchers.h
usr/src/googletest/googlemock/include/gmock/gmock-more-actions.h
usr/src/googletest/googlemock/include/gmock/gmock.h
usr/share/cmake-3.16/Help/release/dev/FindGTest-target-for-gmock.rst
usr/src/googletest/googlemock/scripts/generator/cpp/gmock_class.py
usr/src/googletest/googlemock/scripts/generator/cpp/gmock_class_test.py
usr/src/googletest/googlemock/include/gmock/internal/gmock-internal-utils.h
usr/src/googletest/googlemock/include/gmock/internal/gmock-pp.h
usr/src/googletest/googlemock/include/gmock/internal/gmock-port.h
usr/src/googletest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h
usr/src/googletest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h.pump
usr/src/googletest/googlemock/include/gmock/internal/custom/gmock-matchers.h
usr/src/googletest/googlemock/include/gmock/internal/custom/gmock-port.h

这里面其实可以看到,和gmock有关的文件基本上都是在usr/src目录下的,那其实已经基本能够断定这个电脑的gmock并非是手动安装的,而是使用apt在安装某些库的时候为我们安装到/usr/src目录下的,因为我们手动安装的文件其实往往在/usr/local目录下,为了更进一步地进行确认,我们使用下面的命令:

dpkg -S /usr/src/googletest/googlemock

输出结果

> dpkg -S /usr/src/googletest/googlemock
googletest: /usr/src/googletest/googlemock

所以其实是apt安装的googletest这个库在包含了gmock

然后就是看一下电脑A现在已经安装的google或者是gmock的库有哪些

> sudo apt list --installed| grep -E "google"

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

google-chrome-stable/now 138.0.7204.100-1 amd64 [installed,upgradable to: 139.0.7258.66-1]
google-mock/focal,now 1.10.0-2 amd64 [installed,automatic]
googletest/focal,focal,now 1.10.0-2 all [installed,automatic]
> sudo apt list --installed| grep -E "mock"

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

google-mock/focal,now 1.10.0-2 amd64 [installed,automatic]

发现其实没有一些乱起八糟的lib dev库啥的,就是这几个库,然后就是在电脑B上面同样的走一遍,看一下每一个环节不一致的地方,把没有用到的库删了,把用到了但是安装路径不一致的库删了,把这几个关键的库也purge掉都重新装一遍,具体解决的过程如下所示,最后就好用了。

有问题的电脑B的排查过程

就是还是用上面的那些命令,来对比区别
在使用命令fd gmock | grep -vE 'media|anaconda3|Downloads|Documents'的时候,输出的结果是:

> fd gmock | grep -vE 'anaconda3|Downloads|Documents'
usr/src/gmock
home/tipriest/gmock_test
usr/include/gmock
home/tipriest/gmock_test/gmock_gtest_test.cpp
usr/include/gmock/gmock-cardinalities.h
usr/include/gmock/gmock-spec-builders.h
usr/include/gmock/gmock-more-actions.h
usr/include/gmock/gmock-actions.h
usr/include/gmock/gmock-matchers.h
usr/include/gmock/gmock-more-matchers.h
usr/include/gmock/gmock.h
usr/include/gmock/gmock-generated-matchers.h
usr/include/gmock/gmock-generated-actions.h
usr/include/gmock/gmock-generated-function-mockers.h
usr/include/gmock/gmock-function-mocker.h
usr/include/gmock/gmock-generated-function-mockers.h.pump
usr/include/gmock/gmock-generated-matchers.h.pump
usr/include/gmock/gmock-generated-actions.h.pump
usr/include/gmock/gmock-nice-strict.h
usr/share/doc/libgmock-dev
usr/lib/x86_64-linux-gnu/libgmock.a
usr/lib/x86_64-linux-gnu/libgmock_main.a
usr/lib/x86_64-linux-gnu/pkgconfig/gmock.pc
usr/lib/x86_64-linux-gnu/pkgconfig/gmock_main.pc
usr/share/lintian/overrides/libgmock-dev
var/lib/dpkg/info/libgmock-dev:amd64.list
var/lib/dpkg/info/libgmock-dev:amd64.md5sums
usr/include/gmock/internal/gmock-pp.h
usr/include/gmock/internal/gmock-port.h
usr/include/gmock/internal/gmock-internal-utils.h
usr/include/gmock/internal/custom/gmock-matchers.h
usr/include/gmock/internal/custom/gmock-port.h
usr/include/gmock/internal/custom/gmock-generated-actions.h
usr/include/gmock/internal/custom/gmock-generated-actions.h.pump
usr/share/cmake-3.16/Help/release/dev/FindGTest-target-for-gmock.rst

很明显和之前的电脑A输出的结果有很大区别,所以将包删掉重新装

> sudo apt list --installed| grep -E "google"

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

google-chrome-stable/now 138.0.7204.92-1 amd64 [installed,local]
google-mock/focal,now 1.10.0-2 amd64 [installed]
googletest/focal,focal,now 1.10.0-2 all [installed,automatic]
libgoogle-glog-dev/focal,now 0.4.0-1build1 amd64 [installed]
libgoogle-glog0v5/focal,now 0.4.0-1build1 amd64 [installed,automatic]
> sudo apt purge google-mock googletest libgoogle-glog-dev libgoogle-glog0v5

安装的过程删掉了很多和ROS相关的组件,在删除完成后使用下面的命令在进行安装的时候,又帮忙把google-mock googletest libgtest-dev啥的给装回来了,就很方便

> sudo apt install ros-noetic-desktop-full
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  evemu-tools evtest joystick libasound2-dev libcaca-dev libevemu3 libomp-dev libpulse-dev libsdl-image1.2-dev libsdl1.2-dev libslang2-dev libspnav-dev liburdfdom-tools nvidia-firmware-535-535.183.01 python-enum34
  python-numpy python-pkg-resources python3-bs4 python3-html5lib python3-lxml python3-pyassimp python3-soupsieve python3-webencodings ros-noetic-eigen-stl-containers ros-noetic-librealsense2 ros-noetic-random-numbers
  ros-noetic-ruckig
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
  google-mock googletest libgtest-dev ros-noetic-actionlib ros-noetic-actionlib-msgs ros-noetic-actionlib-tutorials ros-noetic-bond ros-noetic-bond-core ros-noetic-bondcpp ros-noetic-bondpy ros-noetic-camera-calibration
  ros-noetic-camera-calibration-parsers ros-noetic-camera-info-manager ros-noetic-catkin ros-noetic-common-msgs ros-noetic-common-tutorials ros-noetic-compressed-depth-image-transport ros-noetic-compressed-image-transport
  ros-noetic-control-msgs ros-noetic-control-toolbox ros-noetic-controller-interface ros-noetic-controller-manager ros-noetic-controller-manager-msgs ros-noetic-cv-bridge ros-noetic-depth-image-proc ros-noetic-desktop
  ros-noetic-diagnostic-aggregator ros

最终再次使用下面的命令观察gmock存在的文件夹的时候,就看到了和电脑A一致的结果,随后再编译就正常通过了

> fd gmock | grep -vE 'anaconda3|Downloads|Documents'
usr/src/gmock
home/tipriest/gmock_test
home/tipriest/gmock_test/gmock_gtest_test.cpp
usr/src/googletest/googlemock/cmake/gmock_main.pc.in
usr/src/googletest/googlemock/cmake/gmock.pc.in
usr/src/googletest/googlemock/docs/gmock_faq.md
usr/src/googletest/googlemock/include/gmock
usr/src/googletest/googlemock/src/gmock-spec-builders.cc
usr/src/googletest/googlemock/src/gmock-cardinalities.cc
usr/src/googletest/googlemock/src/gmock-all.cc
usr/src/googletest/googlemock/scripts/gmock-config.in
usr/src/googletest/googlemock/scripts/upload_gmock.py
usr/src/googletest/googlemock/scripts/fuse_gmock_files.py
usr/src/googletest/googlemock/scripts/gmock_doctor.py
usr/src/googletest/googlemock/test/gmock_ex_test.cc
usr/src/googletest/googlemock/test/gmock-spec-builders_test.cc
usr/src/googletest/googlemock/test/gmock-generated-actions_test.cc
usr/src/googletest/googlemock/test/gmock_leak_test_.cc
usr/src/googletest/googlemock/test/gmock_all_test.cc
usr/src/googletest/googlemock/test/gmock-cardinalities_test.cc

网站公告

今日签到

点亮在社区的每一天
去签到