ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question
1

How to install libgtest.so with catkin install?

asked 2022-08-23 09:26:25 -0600

LukeAI gravatar image

I have some working end to end rostests built and installed like:

  # builds the test executable against the first test file                       
  add_rostest_gtest(test-end2end                                                 
                    bag_tests/MY_TEST.test 
                    test/end2end_test.cpp                                        
                    src/container_sub.cpp)                                       
  target_link_libraries(test-end2end ${catkin_LIBRARIES})                        
  target_include_directories(test-end2end PRIVATE include)

If I build and run using default configuration catkin tools and rostest, it works as expected

catkin build end2end_testing --catkin-make-args tests
rostest end2end_testing MY_TEST.test --text

However, if I try and do the same in a workspace that has been configured with an install location:

catkin config --install

when I run the test, I get:

...test-end2end: error while loading shared libraries: libgtest.so: cannot open shared object file: No such file or directory

Searching the workspace I found that the unfound executable is in the build dir:

build/end2end_testing/gtest/googlemock/gtest/libgtest.so

So my question is: how can I have it included or at least accessed from, the install dir?

(I could just run my tests from devel, but I want the CI to test being built in install, including all the tests, so it doesn't have to build/install everything twice)

edit retag flag offensive close merge delete

Comments

solution might be this https://answers.ros.org/question/8276...

need to investigate...

LukeAI gravatar image LukeAI  ( 2022-08-25 11:30:50 -0600 )edit

1 Answer

Sort by ยป oldest newest most voted
0

answered 2022-08-25 10:43:13 -0600

130s gravatar image

updated 2022-08-26 16:33:19 -0600

error while loading shared libraries: libgtest.so: cannot open shared object file: No such file or directory

This indicates OS is not seeing the .so file in question in the path it's told to search for libraries.

Searching the workspace I found that the unfound executable is in the build dir:

build/end2end_testing/gtest/googlemock/gtest/libgtest.so

Assuming you ran the search command under the top dir of the workspace, libgtest.so being found under build in the workspace tells us that it's you who built that .so file. Since your workspace is now configured for installation (by catkin config --install), the runtime environment of your workspace also needs to be configured for installation, which you can do by source-ing setup.bash file in Catkin's world. By default, catkin sets install directory directly under the top directory in the workspace. So without changing directory locations, it can be source ./install/setup.bash.

Check if echo $LD_LIBRARY_PATH includes the path under the workspace's install directory.

UPDATE:

build/end2end_testing/gtest/googlemock/gtest/libgtest.so

libgtest.so being in build, not under install means that the .so file is not set to be installed.

Check CMakeLists.txt file that contains the configuration for the .so file in question, make sure it has an installation rule for that file.

Btw, sounds like you're building gtest by yourself instead of using the installer that installs pre-built files, where I don't expect you to see the mentioned issue. Do you really need to build by yourself?


UPDATE-2:

the .so is not manually configured in the CMakeLists, it's built/placed in build automatically by add_rostest_gtest

I see. The direct reason why you're getting the following error is OS (the order of trigger is likely: rostest <- cmake <- catkin test) doesn't see the mentioned dynamic library in the paths given by LD_LIBRARY_PATH. When catkin is configured either with install or no-install, I doubt it'll look into build directory.

test-end2end: error while loading shared libraries: libgtest.so: cannot open shared object file: No such file or directory

I tried locally (on docker) for a pkg that also defines add_rostest_gtest, and I confirm that libgtest.so is generated under build.

# find build/ -iname *.so
build/pkg_foo/gtest/googlemock/gtest/libgtest.so

This lead to me saying this:

  • In ROS or not, I think unit test in general is meant to be executed in non-installation option. Rationale is that common practice is to not install unit test codes so that unit test won't be available in the install space IMO. #q241467 supports my theory I guess.
  • Particularly, (without looking into its code) gtest (and/or add_rostest_gtest implementatino) is likely defined so that it doesn't get installed even catkin/cmake is configured for installation, therefore it's .so gets installed into non-install space. This is just speculation.
edit flag offensive delete link more

Comments

sourcing install/setup.bash adds /home/ME/projects/spss/install/lib to the front of $LD_LIBRARY_PATH, doesn't include doesn't make any difference to observed behaviour.

LukeAI gravatar image LukeAI  ( 2022-08-25 11:26:15 -0600 )edit

@LukeAI Ok I found one thing I forgot to include in my answer. See my update.

130s gravatar image 130s  ( 2022-08-25 11:43:54 -0600 )edit

the .so is not manually configured in the CMakeLists, it's built/placed in build automatically by add_rostest_gtest

LukeAI gravatar image LukeAI  ( 2022-08-26 03:20:15 -0600 )edit

@LukeAI, Ok I can repro your issue, and posted my update.

130s gravatar image 130s  ( 2022-08-26 16:25:17 -0600 )edit

Question Tools

2 followers

Stats

Asked: 2022-08-23 09:26:25 -0600

Seen: 229 times

Last updated: Aug 26 '22