简而言之,我正在尝试与CMake交叉编译CMake,我认为我没有正确地链接库。我想做的可能是不可能的,但我至少想知道为什么不可能,如果是这样的话。
系统:主机是带有Cavium ARM9 CPU的Linux box。它目前正在运行Linux内核版本2.6.24.4和Debian 5.0(Lenny)。我的工作站是运行Ubuntu 12.04 LTS(精确穿山甲)的Core i5。
我的总体目标是让ROS在Linux机器上运行。我必须从源代码编译而不是使用apt,因为Debian 6.0(Squeeze)二进制文件需要Cavium不提供的拇指支持,并且Debian 5.0(Lenny)不需要很多所需的软件包。我在安装所需的各种库方面取得了进展,但是当我进入步骤1.3.1并尝试运行CMake时,我收到了错误
需要CMake 2.8或更高版本。您正在运行2.6.0版本
接下来我尝试在Linux机器上下载并构建CMake 2.8.8,但这对系统来说太过分了。当失败时,我下载了制造商网站上建议的工具链,并使用[www.cmake.org/Wiki/CMake_Cross_Compiling]上的交叉编译指南来构建CMake可执行文件。这是我的工具链文件:
# This one is important
SET(CMAKE_SYSTEM_NAME Linux)
# Specify the cross compiler
SET(CMAKE_C_COMPILER /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc)
SET(CMAKE_CXX_COMPILER /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-g++)
# Where is the target environment
SET(CMAKE_FIND_ROOT_PATH /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu /pathto/crosstool-linux-gcc-4.5.2-gclibc-2.9-oabi/arm-unknown-linux-gnu/arm-unknown-linux-gnu)
# Search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# For libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
但是,在Linux机器上使用二进制文件会产生错误
cmake:/usr/lib/libstdc++.so.6:找不到版本`GLIBCXX_3.4.14'(cmake要求)
果然,图书馆不在那里:
prompt# strings /usr/lib/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBC_2.3
GLIBC_2.0
GLIBC_2.3.2
GLIBC_2.1
GLIBC_2.1.3
GLIBC_2.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
我以前从未进行过交叉编译,但我可以看到两种情况中的一种发生:要么在主机上创建了一个带有更高版本glibcxx链接的二进制文件,要么制造商的工具链比它们的图像更现代。我不知道如何检查发生了什么,或者是否发生了我不知道的事情。
我最后的努力涉及尝试静态交叉编译CMake以希望摆脱链接错误
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain-technologic.cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXE_LINKER_FLAGS_RELEASE="-static" ..
我遇到了构建错误,而且二进制文件也没有用。我得到了:
FATAL: kernel too old
Segmentation fault
我尝试在Linux机器上安装glibcxx 3.4.14,但看起来它不适用于此处理器。
我已尝试搜索CMake依赖项或系统要求,但无法找到任何内容。我还搜索了如何构建CMake,但是大多数搜索都会找到如何用 CMake构建其他东西而不是构建CMake本身。
答案 0 :(得分:4)
我使用CMake对ARM9设备进行了大量的交叉编译,实际上这看起来好像你没有链接到目标设备上的相同库。您不需要自己构建CMake来完成这项工作,因为它确实支持自2.6版以来的交叉编译。只需确保将CMAKE_FIND_ROOT_PATH变量设置为一个路径,在该路径中,您拥有目标设备上的根文件系统的精确副本(具有为目标处理器预编译的库和二进制文件)。这应该可以解决你的问题。
作为旁注,我喜欢使用crosstool-ng来构建我的交叉编译器。它是一个非常好的工具,可以帮助您从头开始构建它们,因此我尝试将编译器版本和glibc与最初用于构建根文件系统的版本相匹配(我通常从{{3}开始使用现成的根文件系统因为我将Slackware用于我的开发盒,而ARMedslack用于我的ARM目标。)