2012-10-11 106 views
10

简而言之,我试图用CMake交叉编译CMake,并且我不认为我正确链接了库。我想做的事情可能是不可能的,但我至少想知道为什么在这种情况下是不可能的。如何通过CMake交叉编译CMake的代码

系统:主机是一个Linux box与Cavium ARM9 CPU。目前它正在运行Linux内核版本2.6.24.4和Debian 5.0(Lenny)。我的工作站是运行Ubuntu   12.04 LTS(Precise Pangolin)的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本身。

回答

3

我使用CMake为ARM9设备进行了大量交叉编译,事实上,这看起来好像没有链接到目标设备上的相同库。你不需要自己编译CMake来完成这个任务,因为它自2.6版以来支持交叉编译。只要确保将CMAKE_FIND_ROOT_PATH变量设置为具有目标设备上的根文件系统的精确副本的路径(为目标处理器预编译库和二进制文件)即可。这应该可以解决你的问题。

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

+1

我的印象是,cmake不支持交叉编译,因为它似乎不包括支持在目标平台上运行二进制文件自动配置测试。我错了吗? – schily