我正在Ubuntu16.04 x86_64 box上尝试交叉编译arm gnueabihf。我在toolchain.cmake文件中使用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 in <target>.dir中,我有g++命令。我希望有像arm-linux-gnueabihf-g++这样的跨工具链的编译器。
查看其他link.txt中的其他<target>,它不是可执行的,而是静态库,有来自交叉工具链(如/usr/bin/arm-linux-gnueabihf-ar )的命令。
为什么在可执行目标而不是arm-linux-gnueabihf-g++上只有g++ in link.txt
请帮忙,否则我很快就会生气的..。
添加我的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)发布于 2016-11-09 08:29:52
检查正确的工具链前缀
通常,CMake会自动确定所需的前缀(并将其存储在内部变量_CMAKE_TOOLCHAIN_PREFIX中)。所以,请反复检查一下,比如:
message(STATUS "_CMAKE_TOOLCHAIN_PREFIX: ${_CMAKE_TOOLCHAIN_PREFIX}")如果值是正确的,但是有前缀和没有前缀的编译器工具的混合,那么这可能是在工具链文件中尝试/更改东西的结果。请尝试删除您的二进制输出目录,包括CMake变量缓存,包括编译器ids,然后从头开始构建。
检查您的工具链是否包含链接器/生成程序
您确定您的工具链也包含链接器/make程序吗?否则,CMake会尝试寻找替代方案。要检查,可以在PATH调用之前清除cmake变量,或者使用以下方法检查缓存的变量:
message(STATUS "CMAKE_MAKE_PROGRAM: ${CMAKE_MAKE_PROGRAM}")我建议将Ninja用于不附带自己的make程序的工具链。它是快速,易于使用,没有混淆两个GNU工具链。它只是:
cmake -G "Ninja" -D... 另见这里。
将工具链简化为最简单的形式--
如果它仍然不能工作,则可以使用CMAKE_CXX_COMPILER_TARGET全局变量显式定义工具链文件中编译器的前缀。
尝试构建一个简单的"Hello“程序,其中包含一个非常基本的/简化的工具链文件。
有关示例,请参见例如这里
set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) set(三臂-linux-gnueabihf) set(CMAKE_C_COMPILER gcc) set(CMAKE_C_COMPILER_TARGET ${tri}) set(CMAKE_CXX_COMPILER g++) set(CMAKE_CXX_COMPILER_TARGET ${tri})
试图强制工具链路径设置
除了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 "")参考资料
https://stackoverflow.com/questions/40497214
复制相似问题