我正在尝试在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)
答案 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 "")
<强>参考强>