Hi guys,
I'm trying to cross-compile my own packages for armv7, so far I've been able to specify the correct toolchain by using the rostoolchain.cmake file. I also fixed a lot of other things I've had trouble with, but the only thing I'm having trouble with right now is specifying the correct folder for ld to search for libraries. I have stored all the ARM-compiled .so files I need in /opt/armv7/usr/lib, but ld still tries to look for libraries in /opt/ros/groovy/lib and /usr/lib. Since the files in those directories are compiled for Intel, that doesn't work of course. This is the error I get when I try to compile:
/opt/armv7/bin/../lib/gcc/arm-v7a8-linux-gnueabi/4.4.1/../../../../arm-v7a8-linux-
gnueabi/bin/ld: skipping incompatible /opt/ros/groovy/lib/libroscpp.so when searching for -lroscpp
/opt/armv7/bin/../lib/gcc/arm-v7a8-linux-gnueabi/4.4.1/../../../../arm-v7a8-linux-gnueabi/bin/ld: cannot find -lroscpp
How do I specify the correct folder for ld to look into? So far, I've tried the following "solutions" with no success:
- Adding /opt/armv7/usr/lib to LD_LIBRARY_PATH, which didn't work. Seems like the directories I added were ignored completely.
- Adding lines like set(CMAKE_SYSTEM_LIBRARY_PATH ...) or set(CMAKE_LIBRARY_PATH) to rostoolchain.cmake with the same result as with the LD_LIBRARY_PATH solution.
- Setting the LD_PRELOAD variable, which gave me:
ERROR: ld.so: object '/opt/armv7/usr/lib/libroscpp.so' from LD_PRELOAD cannot be preloaded: ignored.
- Using the /etc/ld.so.conf.d and /etc/ld.so.conf files, which gave the same results as the first and second solutions (in other words, no results..)
- Linking manually using target_link_libraries, which helped for direct dependencies of my project, but not for the second level dependencies. For example, if I manually link /opt/armv7/usr/lib/libroscpp.so then it is able to find libroscpp.so, but not /usr/lib/libboost_date_time-mt.so.
- Replacing the whole lib folder in /opt/ros/groovy by my own lib folder, except for rospack.so because ROS needs that in order to make use of the Makefile. This didn't work since ld still looks for libraries in /usr/lib. I prefer not to replace my /usr/lib folder for the arm libraries..
- Only replacing specific Intel library files I need by their ARM counterparts, which worked for those libraries, but not for the rest of course. This solution is actually the same as the one above, except that I'm not replacing everything altogether. I do not prefer to replace all the libraries one by one..
I think I tried even more, but I forgot.. At least these are the most important things I tried. I'm stuck for weeks now so I'd really appreciate it if someone is able to help me. My rostoolchain.cmake file looks like this by the way:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER /opt/armv7/bin/arm-v7a8-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER /opt/armv7/bin/arm-v7a8-linux-gnueabi-g++)
set(CMAKE_FIND_ROOT_PATH /opt/armv7/usr)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
find_file(TOOLCHAINCONFIG
rostoolchain.cmake
PATHS ENV ROS_ROOT
NO_DEFAULT_PATH)
if(TOOLCHAINCONFIG)
include(${TOOLCHAINCONFIG})
endif(TOOLCHAINCONFIG)
Thanks in advance and please tell me if you need more information. I'm aware that I might have left out some details for some of the solutions I tried, but I tried so many of them that I already forgot the exact details except that it didn't work.. But if it's needed I can go and try to reproduce the results again.
↧