我正在尝试在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
。
为什么我刚才G ++中link.txt
的可执行的目标,而不是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)
检查正确的工具链前缀
通常,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...
另请参阅此处。
将工具链简化为最简单的形式
如果仍然不起作用,则可以使用CMAKE_C_COMPILER_TARGET
/CMAKE_CXX_COMPILER_TARGET
全局变量在工具链文件中显式定义编译器的前缀。
尝试使用非常基本/精简的工具链文件构建一个简单的“ Hello World”程序。
有关示例,请参见此处:
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 "")
参考
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句