22

简而言之,我正在尝试使用 CMake 交叉编译 CMake,但我认为我没有正确链接库。我想做的事情可能是不可能的,但我至少想知道如果是这样的话,为什么它是不可能的。

系统:主机是一个带有 Cavium ARM9 CPU的Linux机器。它目前运行的是 2.6.24.4 版的 Linux 内核和Debian 5.0 (Lenny)。我的工作站是运行 Ubuntu 12.04 LTS(Precise Pangolin)的Core i5 。

我的总体目标是让ROS在 Linux 机器上运行。我必须从源代码编译而不是使用 apt,因为 Debian 6.0 (Squeeze) 二进制文件需要 Cavium 不提供的 thumb 支持,而且 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 本身。

4

1 回答 1

8

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

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

于 2012-10-22T14:05:28.970 回答