cmake - 如何通过CMake交叉编译CMake for ARM

标签 cmake cross-compiling glibc ros

简而言之,我试图将CMake与CMake交叉编译,而且我认为我没有正确地链接库。我想做的事可能无法实现,但是我至少想知道为什么不可以这样做。

系统:主机是带有Cavium ARM9 CPU的Linux box。它当前正在运行2.6.24.4版的Linux内核和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 or higher is required. You are running version 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: version `GLIBCXX_3.4.14' not found (required by 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本身。

最佳答案

我使用CMake对ARM9设备进行了很多交叉编译,实际上,这看起来好像没有链接到目标设备上的相同库。您不需要自己构建CMake即可完成此操作,因为自2.6版以来,它确实对交叉编译提供了良好的支持。只需确保将CMAKE_FIND_ROOT_PATH变量设置为一个路径,即可在其中拥有目标设备上根文件系统的精确副本(已为目标处理器预编译了库和二进制文件)。那应该解决您的问题。

作为旁注,我喜欢使用crosstool-ng构建我的交叉编译器。这是一个非常好的工具,可以帮助您从头开始构建它们,因此我尝试将编译器版本和glibc与最初用于构建根文件系统的版本进行匹配(我通常从ARMedslack开始使用现成的根文件系统,因为我在我的开发箱中使用Slackware,在我的ARM目标中使用ARMedslack)。

关于cmake - 如何通过CMake交叉编译CMake for ARM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12844772/

相关文章:

java - Android 上的 FreeRDP - 如何让此代码在 android 和 windows 中工作?

cmake - 使用 CMake 缓存变量 "before"定义它

c++ - 使用基于编译器的 cmake 条件 CXX_FLAGS?

c++ - 使用带有新 glibc 和 binutils 的 GCC 为具有旧 sysroot 的系统构建软件

c++ - libcudart 和 gcc 的本地构建链接错误的 glibc

python - Cmake 找不到 PythonLibs

html - 我如何将 AS3 转换为 Haxe?

android - 交叉编译arm64

c - 查找有关将 Linux 应用程序移植到 Windows 的信息

linux - 执行glibc的ld-2.6.1.so时收到 "Illegal Instruction"