在電腦上源碼編譯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-enum34python-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-numbersros-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-calibrationros-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-transportros-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-desktopros-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