交叉编译时,CMake的link.txt中的链接器命令应该是什么?

时间:2016-11-08 22:04:04

标签: cmake arm cross-compiling

我正在尝试在Ubuntu 16.04 x86_64框上交叉编译arm-linux-gnueabihf。 我使用Cmake和toolchain.cmake文件,其中可能所有重要的都被声明为:

set(CMAKE_C_COMPILER "/usr/bin/arm-linux-gnueabihf-gcc")
set(CMAKE_CXX_COMPILER "/usr/bin/arm-linux-gnueabihf-g++")
set(CMAKE_FIND_ROOT_PATH "/usr/arm-linux-gnueabihf")

它似乎产生了我所需要的一切。但是,make在链接可执行目标时失败。在那里窥探我发现在link.txt <target>.dir中我有 g ++ 命令。 我希望有来自arm-linux-gnueabihf-g++等交叉工具链的编译器。

查看其他link.txt中不可执行的<target>但是静态库,有来自/usr/bin/arm-linux-gnueabihf-ar等交叉工具链的命令。

为什么link.txt中的 g ++ 位于可执行目标而不是 arm-linux-gnueabihf-g ++

请帮忙,否则我很快就会生气..

添加我的toolchain.cmake文件:

SET(CMAKE_CROSSCOMPILING TRUE)

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR ARMV7)

set(CMAKE_C_COMPILER "/usr/bin/arm-linux-gnueabihf-gcc")
set(CMAKE_CXX_COMPILER "/usr/bin/arm-linux-gnueabihf-g++")

set(CMAKE_C_COMPILER_TARGET "/usr/bin/arm-linux-gnueabihf-gcc")
set(CMAKE_CXX_COMPILER_TARGET "/usr/bin/arm-linux-gnueabihf-g++")

SET(CMAKE_LINKER "/usr/bin/arm-linux-gnueabihf-g++")

# path exists, but not needed to actually compile this
set(CMAKE_FIND_ROOT_PATH "/usr/arm-linux-gnueabihf")

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

SET(OpenBLAS_DIR /root/OpenBLAS/buildArm/lib/cmake/openblas)

1 个答案:

答案 0 :(得分:1)

检查正确的工具链前缀

通常,CMake会自动确定所需的前缀(并将其存储在内部变量_CMAKE_TOOLCHAIN_PREFIX中)。所以请用以下内容进行交叉检查:

message(STATUS "_CMAKE_TOOLCHAIN_PREFIX: ${_CMAKE_TOOLCHAIN_PREFIX}")

如果值正确但你有混合使用和不带前缀的编译器工具,那可能是在工具链文件中尝试/更改内容的结果。请尝试删除包含CMake变量缓存的二进制输出目录,包括编译器ID,并从头开始构建。

检查您的工具链是否包含链接器/制作程序

您确定您的工具链还包含链接器/ make程序吗?否则CMake会尝试搜索替代品。要检查您是否可以在PATH调用之前清除cmake变量,或者使用以下命令检查缓存变量:

message(STATUS "CMAKE_MAKE_PROGRAM: ${CMAKE_MAKE_PROGRAM}")

我建议将Ninja用于不带自己的make程序的工具链。它快速,易于使用,并且没有与两个GNU工具链混淆。它只是:

cmake -G "Ninja" -D... 

另见here

将工具链缩减为最简单的表格

如果它仍然不起作用,您可以使用CMAKE_C_COMPILER_TARGET/CMAKE_CXX_COMPILER_TARGET全局变量在工具链文件中显式定义编译器的前缀。

尝试构建一个简单的&#34; Hello World&#34;程序包含一个非常基本/简化的工具链文件。

有关示例,请参阅例如here

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(triple arm-linux-gnueabihf)

set(CMAKE_C_COMPILER gcc)
set(CMAKE_C_COMPILER_TARGET ${triple})
set(CMAKE_CXX_COMPILER g++)
set(CMAKE_CXX_COMPILER_TARGET ${triple})

尝试强制使用工具链路径设置

请不要修改任何内容 - 除了CMakeCache.txt - CMake确实创建了。它将在下次CMake再次运行其配置/生成步骤时丢失(例如,当更改工具链或CMakeLists.txt文件时)。

您始终可以使用set(... CACHE INTERNAL "")语法强制在工具链文件中设置工具的路径。所以在你的情况下,它看起来像:

SET(CMAKE_LINKER "/usr/bin/arm-linux-gnueabihf-ld" CACHE INTERNAL "")
SET(CMAKE_AR "/usr/bin/arm-linux-gnueabihf-ar" CACHE INTERNAL "")

<强>参考