ROS2交叉编译时找不到PythonLibs “Could not find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)”
问题原因
“Could not find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)”
这个问题之所以出现是因为没有在默认的路径下找到libpython3.6m.so
。
还有${TX2_ROOTFS}/usr/include/python3.6
中包含Python.h
头文件
为什么叫libpython3.6m.so
而不是libpython.so
,原因出在/usr/share/cmake-3.19/Modules/FindPythonLibs.cmake
中
find_library(PYTHON_LIBRARY
NAMES
python${_CURRENT_VERSION_NO_DOTS}
python${_CURRENT_VERSION}mu
python${_CURRENT_VERSION}m
python${_CURRENT_VERSION}u
python${_CURRENT_VERSION}
NAMES_PER_DIR
PATH_SUFFIXES python${_CURRENT_VERSION}/config
)
检查tx2的sysroot,发现在${TX2_SYSROOT}/usr/lib/aarch64-linux-gnu/
中存在libpython3.6m.so.1
以及libpython3.6m.so.1.0
唯独没有libpython3.6m.so
,而libpython3.6m.so
却在${TX2_SYSROOT}/usr/lib/python3.6/config-3.6m-aarch64-linux-gnu
中
~/tx2-rootfs/usr/lib/python3.6/config-3.6m-aarch64-linux-gnu$ ls -la
lrwxrwxrwx 1 admin admin 42 Jul 17 12:50 libpython3.6.so -> ../../aarch64-linux-gnu/libpython3.6m.so.1
lrwxrwxrwx 1 admin admin 42 Jul 17 12:50 libpython3.6m.so -> ../../aarch64-linux-gnu/libpython3.6m.so.1
很明显cmake的find_library搜索路径中并不存在这么复杂的路径python3.6/config-3.6m-aarch64-linux-gnu
为了让cmake能找到libpython3.6m.so
可以在${TX2_SYSROOT}/usr/lib/aarch64-linux-gnu/
中创建一个libpython3.6m.so.1
的符号链接libpython3.6m.so
解决办法
$ ln -s libpython3.6m.so.1 libpython3.6m.so
$ ls -la
lrwxrwxrwx 1 admin admin 42 Jul 17 12:50 libpython3.6.so -> aarch64-linux-gnu/libpython3.6m.so.1
此外如果你的${TX2_ROOTFS}/usr/include/python3.6
不存在,或其中没有Python.h
头文件,那么你还要从TX2中拷贝相应头文件和路径。
rsync -av nvidia@192.168.55.1:/usr/include/python3.6 ${TX2_ROOTFS}/usr/include
谢谢关注!