简体   繁体   中英

Load shared libraries from lib directory in CMake?

I have downloaded a ROS2 demo from the examples repository .

Specifically, I have used minimal_subscriber and minimal_publisher .

I have ROS2 installed in /opt/ros2 and when I build these two examples with colcon build , it generates an install/ directory with lib/ , shared/ and the other usual directory structure.

I can execute and run these demos perfectly fine with my current setup in my machine, but these executables link to libraries present in /opt/ros2 , so when I want to execute them in another machine without ROS2 installed or I move my ROS2 installation in my machine, the executables cannot find the shared objects.

I've added a really simple script that adds all dependencies to install/lib when building but the executables don't seem to care, they aren't looking for shared libraries in the generated lib directory, they keep trying to search in /opt/ros2 .

I believe this is something I should solve in CMake and it's not ROS2 specific, so, is there any way I can tell my generated executables to search in a diferent directory? ( ../lib or ./lib in my case)

If you are building them yourself (assumed since you mention CMake), you can set the RPATH in CMake ( docs here ). Specifically set the CMAKE_INSTALL_RPATH something like:

set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")

If you can't rebuild them, you can set LD_LIBRARY_PATH in your environment to where the libraries are located, or you can patch the executables themselves with an updated RPATH by using patchelf .

In order to get a relative RPATH rather than an absolute RPATH, use the $ORIGIN variable in your rpath spec. See " Recommendations " the the link above for more details.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM