
清空记录
历史记录
取消
清空记录
历史记录

常见编译报错解决方法
sudo -i su# modprobe zram# echo 12G > /sys/block/zram0/disksize# echo 6G > /sys/block/zram0/mem_limit# mkswap /dev/zram0# swapon /dev/zram0# free -htotal used free shared buff/cache availableMem: 14Gi 3.9Gi 5.5Gi 27Mi 5.4Gi 10GiSwap: 11Gi 2.7Gi 9.3Gi
root@rk3562-buildroot:/opt/ros-foxy# ros2 run demo_nodes_cpp talker/opt/ros-foxy/lib/demo_nodes_cpp/talker: /lib/libstdc++.so.6: version`GLIBCXX_3.4.30' not found (required by /opt/ros-foxy/lib/librclcpp.so)/opt/ros-foxy/lib/demo_nodes_cpp/talker: /lib/libstdc++.so.6: version`GLIBCXX_3.4.30' not found (required by /opt/ros-foxy/lib/libspdlog.so.1)
ls /opt/ros/lib/python3.10/site-packages/rclpy/_rclpy_pybind11.cpython-310- x86_64-linux-gnu.so
PYTHON_MODULE_EXTENSION:INTERNAL=.cpython-310-x86_64-linux-gnu.so
在pybind11/tools/FindPythonLibsNew.cmake较新的代码中,建议若是Cross Compling,可在外部手动添加python的参数:
1. 修改src/ros2/pybind11_vendor中pybind11升级到v2.10.2。
2. 并在pybind11_verdor/CMakeLists.txt中设置以下2个参数,
指定具体的 PYTHON_MODULE_EXTENSION:
list(APPEND extra_cmake_args "-DPYBIND11_PYTHONLIBS_OVERWRITE=OFF")list(APPEND extra_cmake_args "-DPYTHON_MODULE_EXTENSION=.cpython-310-aarch64-linux-gnu.so")
3. 在cross-compile.mixin中,也声明:
- "-DPYBIND11_PYTHONLIBS_OVERWRITE=OFF"- "-DPYTHON_MODULE_EXTENSION=.cpython-310-aarch64-linux-gnu.so"
上述修改后, 仍然发现rclpy在编译时,其CMakeCache.txt文件中得到的
PYTHON_MODULE_EXTENSION仍指向"x86_64",但第二次再编译时,会被修改成预期的aarch64。有以下原因:
1. 在pybind11/tools/pybind11NewTools.cmake中, 若未设置过
PYBIND11_PYTHON_EXECUTABLE_LAST、或它值被修改了,会直接清空PYTHON_MODULE_EXTENSION。
76 if(NOT ${_Python}_EXECUTABLE STREQUAL PYBIND11_PYTHON_EXECUTABLE_LAST)77 # Detect changes to the Python version/binary in subsequent CMake runs,and refresh config if needed78 unset(PYTHON_IS_DEBUG CACHE)79 unset(PYTHON_MODULE_EXTENSION CACHE)80 set(PYBIND11_PYTHON_EXECUTABLE_LAST81 "${${_Python}_EXECUTABLE}"82 CACHE INTERNAL "Python executable during the last CMake run")83 endif()2. 在pybind11 issue #236 也有类似的现象。
3. 修改pybind11解决: 若是
PYBIND11_PYTHONLIBS_OVERWRITE="OFF",则不重设上述参数:
commit f7f1f2a927dd785d109833e411325de4c248719f (HEAD -> v2.10.2-fix)Author: cross-build for rk-linux-sdkDate: Fri Sep 22 08:24:58 2023 +0000Do not override the PYTHON_MODULE_EXTENSION if cross buildingAs suggested in tools/FindPythonLibsNew.cmake,PYBIND11_PYTHONLIBS_OVERWRITE is a flag to indicate that we set python variablesmanually when cross building.In this case, do not override variables if PYBIND11_PYTHON_EXECUTABLE_LASTchanged or is empty.diff --git a/tools/pybind11NewTools.cmake b/tools/pybind11NewTools.cmakeindex 7d7424a7..91980dad 100644--- a/tools/pybind11NewTools.cmake+++ b/tools/pybind11NewTools.cmake@@ -73,7 +73,7 @@ if(NOT DEFINED ${_Python}_EXECUTABLE)endif()-if(NOT ${_Python}_EXECUTABLE STREQUAL PYBIND11_PYTHON_EXECUTABLE_LAST)7.4 google_benchmark工程缺少limits头文件编译foxy时会报如下错误,原因是缺少头文件:该修改在ROS2较新版本中已经修复; 补丁包也有包含7.5 Linux SDK工具链中定义_FORTIFY_SOURCE+if(NOT ${_Python}_EXECUTABLE STREQUAL PYBIND11_PYTHON_EXECUTABLE_LAST AND NOTPYBIND11_PYTHONLIBS_OVERWRITE STREQUAL "OFF")# Detect changes to the Python version/binary in subsequent CMake runs, andrefresh config if neededunset(PYTHON_IS_DEBUG CACHE)unset(PYTH
In file included from /buildroot/build/ros/google_benchmark_vendor/benchmark-1.5.2-prefix/src/benchmark-1.5.2/src/benchmark_register.cc:15:/buildroot/build/ros/google_benchmark_vendor/benchmark-1.5.2-prefix/src/benchmark-1.5.2/src/benchmark_register.h: In function ‘typenamestd::vector::iterator benchmark::internal::AddPowers(std::vector *, T, T,int)’:/buildroot/build/ros/google_benchmark_vendor/benchmark-1.5.2-prefix/src/benchmark-1.5.2/src/benchmark_register.h:22:30: error:‘numeric_limits’ is not a member of ‘std’22 | static const T kmax = std::numeric_limits ::max();| ^~~~~~~~~~~~~~
/buildroot/build/ros/google_benchmark_vendor/benchmark-1.5.2-prefix/src/benchmark-1.5.2/src/benchmark_register.h#include <limits>
--- stderr: mimick_vendorCloning into 'mimick-f171450b5ebaa3d2538c762a059dfc6ab7a01039'...fatal: unable to access 'https://github.com/ros2/Mimick.git/': gnutls_handshake()failed: Error in the pull function.Cloning into 'mimick-f171450b5ebaa3d2538c762a059dfc6ab7a01039'...HEAD is now at f171450 Add armv7l as a 32-bit ARM architecture. (#16)In file included from /opt/aarch64-buildroot-linux-gnu_sdk-buildroot/aarch64-buildroot-linux-gnu/sysroot/usr/include/errno.h:25,from /buildroot/build/ros/mimick_vendor/mimickf171450b5ebaa3d2538c762a059dfc6ab7a01039-prefix/src/mimickf171450b5ebaa3d2538c762a059dfc6ab7a01039/include/mimick/mock.h:27,from /buildroot/build/ros/mimick_vendor/mimickf171450b5ebaa3d2538c762a059dfc6ab7a01039-prefix/src/mimickf171450b5ebaa3d2538c762a059dfc6ab7a01039/include/mimick/mimick.h:401,from /buildroot/build/ros/mimick_vendor/mimickf171450b5ebaa3d2538c762a059dfc6ab7a01039-prefix/src/mimickf171450b5ebaa3d2538c762a059dfc6ab7a01039/sample/strdup/test.c:1:报错仅在指定了-DCMAKE_TOOLCHAIN_FILE="/opt/aarch64-buildroot-linux-gnu_sdkbuildroot/share/buildroot/toolchainfile.cmake"交叉工具链,且该cmake定义了_FORTIFY_SOURCE可不指定CMAKE_TOOLCHAIN_FILE,或删除_FORTIFY_SOURCE7.6 CMake找不到exlibConfig.cmake编译ament_cmake_vendor_package报找不到exlib,但实际该exlib库都被正确指定了。/opt/aarch64-buildroot-linux-gnu_sdk-buildroot/aarch64-buildroot-linuxgnu/sysroot/usr/include/features.h:412:4: error: #warning _FORTIFY_SOURCErequires compiling with optimization (-O) [-Werror=cpp]412 | # warning _FORTIFY_SOURCE requires compiling with optimization (-O)| ^~~~~~~cc1: all warnings being treated as errorsmake[5]: *** [sample/strdup/CMakeFiles/strdup_test.dir/build.make:63:sample/strdup/CMakeFiles/strdup_test.dir/test.c.o] Error 1make[4]: *** [CMakeFiles/Makefile2:302:sample/strdup/CMakeFiles/strdup_test.dir/all] Error 2make[4]: *** Waiting for unfinished jobs....In file included from /opt/aarch64-buildroot-linux-gnu_sdk-buildroot/aarch64-buildroot-linux-gnu/sysroot/usr/include/errno.h:25,from /buildroot/build/ros/mimick_vendor/mimickf171450b5ebaa3d2538c762a059dfc6ab7a01039-prefix/src/mimickf171450b5ebaa3d2538c762a059dfc6ab7a01039/include/mimick/mock.h:27,from /buildroot/build/ros/mimick_vendor/mimickf171450b5ebaa3d2538c762a059dfc6ab7a01039-prefix/src/mimickf171450b5ebaa3d2538c762a059dfc6ab7a01039/include/mimick/mimick.h:401,from /buildroot/build/ros/mimick_vendor/mimickf171450b5ebaa3d2538c762a059dfc6ab7a01039-prefix/src/mimickf171450b5ebaa3d2538c762a059dfc6ab7a01039/test/test.c:1:/opt/aarch64-buildroot-linux-gnu_sdk-buildroot/aarch64-buildroot-linuxgnu/sysroot/usr/include/features.h:412:4: error: #warning _FORTIFY_SOURCErequires compiling with optimization (-O) [-Werror=cpp]412 | # warning _FORTIFY_SOURCE requires compiling with optimization (-O)| ^~~~~~~cc1: all warnings being treated as errors
报错仅指定了
-DCMAKE_TOOLCHAIN_FILE="/opt/aarch64-buildroot-linux-gnu_sdkbuildroot/share/buildroot/toolchainfile.cmake"交叉工具链,且该cmake定义了_FORTIFY_SOURCE。
可不指定CMAKE_TOOLCHAIN_FILE,或删除_FORTIFY_SOURCE。
root:/buildroot/build/ros/ament_cmake_vendor_package/test# make[ 33%] Built target exlib_bad[ 66%] Built target exlib_good[ 71%] Performing configure step for 'depender'loading initial cache file/buildroot/build/ros/ament_cmake_vendor_package/test/depender-config.cmakeCMake Error at CMakeLists.txt:4 (find_package):By not providing "Findexlib.cmake" in CMAKE_MODULE_PATH this project hasasked CMake to find a package configuration file provided by "exlib", butCMake did not find one.Could not find a package configuration file provided by "exlib" with any ofthe following names:exlibConfig.cmakeexlib-config.cmakeAdd the installation prefix of "exlib" to CMAKE_PREFIX_PATH or set"exlib_DIR" to a directory containing one of the above files. If "exlib"provides a separate development package or SDK, be sure it has beeninstalled.# strace make 可以看到:[pid 458018] newfstatat(AT_FDCWD, "/opt/aarch64-buildroot-linux-gnu_sdkbuildroot/aarch64-buildroot-linuxgnu/sysroot/buildroot/build/ros/ament_cmake_vendor_package/test/exlib_badprefix/install", 0x7ffca495cf50, 0) = -1 ENOENT (No such file or directory)# :# grep CMAKE_PREFIX_PATH depender-config.cmakeset(CMAKE_PREFIX_PATH [=[/buildroot/build/ros/ament_cmake_vendor_package/test/exlib_badprefix/install;/buildroot/build/ros/ament_cmake_vendor_package/test/exlib_goodprefix/install;/buildroot/build/ros/ament_cmake_vendor_package/test/dependerprefix/install]=] CACHE INTERNAL "")它去找了Toolchain目录下的sysroot/$CMAKE_PREFIX_PATH,所以找不到。
CMAKE_PREFIX_PATH设置是正确的,有包含exlib库的路径。
通过strace make 可以看到工具链实际去找的路径不正确,多加了
/opt/aarch64-buildroot-linuxgnu_sdk-buildroot/aarch64-buildroot-linux-gnu/sysroot/
原因: colcon命令中指定了参数
--cmake-args -DCMAKE_TOOLCHAIN_FILE="/opt/aarch64-buildroot-linux-gnu_sdk-buildroot/share/buildroot/toolchainfile.cmake" ,该设置与export环境变量mimix中设置的编译工具链不同导致。
Starting >>> tracetools--- stderr: tracetoolsCMake Error at /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230(message):Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE)Reason given by package: The command"/usr/bin/pkg-config" --versionfailed with output:stderr:/usr/bin/pkg-config: symbol lookup error: /usr/bin/pkg-config: undefinedsymbol: pkgconf_cross_personality_deinitresult:127Call Stack (most recent call first):/usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:594(_FPHSA_FAILURE_MESSAGE)/usr/share/cmake-3.22/Modules/FindPkgConfig.cmake:99(find_package_handle_standard_args)CMakeLists.txt:35 (find_package)
pkg_check_modules(LTTNG REQUIRED lttng-ust)
编译报错:
Starting >>> tracetools--- stderr: tracetoolsCMake Error at /usr/share/cmake-3.22/Modules/FindPkgConfig.cmake:611 (message):A required package was not foundCall Stack (most recent call first):/usr/share/cmake-3.22/Modules/FindPkgConfig.cmake:833(_pkg_check_modules_internal)CMakeLists.txt:36 (pkg_check_modules)
通过strace -f 去抓取log, 发现并未在Linux SDK的sysroot中去查找,因此报错。
需要设置以下环境变量:
export PKG_CONFIG_PATH=/buildroot/host/aarch64-buildroot-linuxgnu/sysroot/usr/lib/pkgconfig
另一种情况是pkg-config找到了docker中的lttng,而不是target目标的,并报错如下:
Starting >>> tracetools--- stderr: tracetools/usr/lib/gcc-cross/aarch64-linux-gnu/11/../../../../aarch64-linux-gnu/bin/ld:cannot find -llttng-ust-common: No such file or directorycollect2: error: ld returned 1 exit statusgmake[2]: *** [CMakeFiles/tracetools.dir/build.make:129: libtracetools.so] Error1gmake[1]: *** [CMakeFiles/Makefile2:161: CMakeFiles/tracetools.dir/all] Error 2gmake[1]: *** Waiting for unfinished jobs....gmake: *** [Makefile:146: all] Error 2---Failed <<< tracetools [4.72s, exited with code 2]
因为找到的是docker的lttng,它的版本与buildroot不同, 前者lttng-ust.pc声明需要链接lttng-ustcommon,但buildroot中缺少lttng-ust-common这个库。
同样需要设置环境变量:
export PKG_CONFIG_PATH=/buildroot/host/aarch64-buildroot-linuxgnu/sysroot/usr/lib/pkgconfig
该参数已经在编译脚本中指定
Docker中可以不安装lttng包
Starting >>> orocos_kdl_vendor--- stderr: orocos_kdl_vendorCloning into 'orocos_kdl-507de66'...done.HEAD is now at 507de66 Fix CMake warning on Windows (#392)Submodule 'python_orocos_kdl/pybind11' (https://github.com/pybind/pybind11.git)registered for path 'python_orocos_kdl/pybind11'Cloning into '/buildroot/build/ros/orocos_kdl_vendor/orocos_kdl-507de66-prefix/src/orocos_kdl-507de66/python_orocos_kdl/pybind11'...CMake Error: The following variables are used in this project, but they are setto NOTFOUND.Please set them or make sure they are set and tested correctly in the CMakefiles:EIGEN3_INCLUDE_DIR (ADVANCED)
因为Linux SDK编译过程中生成的include文件路径需要单独指定, 否则cmake无法搜索得到,如下:
export CMAKE_INCLUDE_PATH='/buildroot/host/aarch64-buildroot-linuxgnu/sysroot/usr/include/'
该参数已经在编译脚本中指定
--- stderr: action_msgsaarch64-buildroot-linux-gnu-gcc: WARNING: unsafe header/library path used incross-compilation: '-isystem' '/usr/local/lib/python3.10/distpackages/numpy/core/include'
在交叉编译过程中, python使用的是host端的/usr/bin/python,当numpy/numpyconfig.h查找不到时, 下列 的获取include dir无法正确得到目标板子的路径:
# Check if numpy is in the include pathfind_file(_numpy_h numpy/numpyconfig.hPATHS ${PythonExtra_INCLUDE_DIRS})if(APPLE OR WIN32 OR NOT _numpy_h)# add include directory for numpy headersset(_python_code"import numpy""print(numpy.get_include())")
明确是由PythonExtra_INCLUDE_DIRS定义查找路径后, 在pybind11中查找该参数的定义是来自PYTHON_INCLUDE_DIR,因为我们是交叉编译,可在cross_compile.mimix中预设好该值。该参数已经在编译脚本中指定,可以指定多个目录。
