我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C++ 项目。我为 CMake 创建了一个工具链文件,但似乎存在错误或缺少一些我无法找到的东西。当使用下面的工具链文件调用 CMake 时,出现以下错误。
CMake命令:
cmake -DCMAKE_TOOLCHAIN_FILE="..\Src\Build\Toolchain-clang-arm.cmake"
-GNinja ..\Src\
Output:
-- C 编译器标识为 Clang 7.0.0 CMake 错误,位于 C:/Users/user/scoop/apps/cmake/3.13.4/share/cmake-3.13/Modules/CMakeDetermineCompilerId.cmake:802
(消息):Clang 编译工具
“C:/Program Files/LLVM/bin/clang.exe”
以 MSVC ABI 为目标,但具有类似 GNU 的命令行界面。
不支持此操作。使用 'clang-cl' 代替,例如通过设置
环境中的“CC=clang-cl”。此外,使用 MSVC
命令行环境。调用堆栈(首先是最近的调用):
C:/Users/user/scoop/apps/cmake/3.13.4/share/cmake-3.13/Modules/CMakeDetermineCCompiler.cmake:113
(CMAKE_DIAGNOSE_UNSUPPORTED_CLANG)CMakeLists.txt:2(项目)
-- 配置不完整,出现错误!
CMake 工具链文件(工具链-clang-arm.cmake):
set(CMAKE_CROSSCOMPILING TRUE)
SET(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR arm)
# Clang target triple
SET(TARGET armv7-none-eabi)
# specify the cross compiler
SET(CMAKE_C_COMPILER_TARGET ${TARGET})
SET(CMAKE_C_COMPILER clang)
SET(CMAKE_CXX_COMPILER_TARGET ${TARGET})
SET(CMAKE_CXX_COMPILER clang++)
SET(CMAKE_ASM_COMPILER_TARGET ${TARGET})
SET(CMAKE_ASM_COMPILER clang)
# C/C++ toolchain
SET(TOOLCHAIN "C:/Program Files (x86)/GNU Tools ARM Embedded/7 2018-q2-update")
SET(CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN ${TOOLCHAIN})
SET(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN ${TOOLCHAIN})
# specify compiler flags
SET(ARCH_FLAGS "-target armv7-none-eabi -mcpu=cortex-a5")
SET(CMAKE_C_FLAGS "-Wall -Wextra ${ARCH_FLAGS}" CACHE STRING "Common flags for C compiler")
SET(CMAKE_CXX_FLAGS "-Wall -Wextra -std=c++11 -fno-exceptions -fno-threadsafe-statics ${ARCH_FLAGS}" CACHE STRING "Common flags for C++ compiler")
我用的是CMake https://cmake.org/cmake/help/latest/manual/cmake-toolchains.7.html#cross-compiling-using-clang and Clang https://clang.llvm.org/docs/CrossCompilation.html文档和一些随机链接 https://gist.github.com/vpetrigo/29e3bfbe7d4aa133e4f661c8420af172从网上创建工具链文件。整个项目可以使用适用于 Windows 的 ARM GCC 进行良好的编译,因此工具链文件似乎是拼图中唯一缺失的部分。
EDIT
我尝试通过强制编译器来解决 CMake 编译器检查。我将这些行替换为 SET(CMAKE_C_COMPILER clang)、SET(CMAKE_CXX_COMPILER clang++) 等:
CMAKE_FORCE_C_COMPILER(clang Clang)
CMAKE_FORCE_CXX_COMPILER(clang++ Clang)
错误保持不变。
EDIT
我可以使用 clang -target arm-none-eabi 成功编译 hello world 示例。所以问题似乎出在 CMake 中。我创建了一个bug https://gitlab.kitware.com/cmake/cmake/issues/18880在 CMake 问题跟踪器中。
工具版本:
- clang 版本 7.0.0 (tags/RELEASE_700/final)
- cmake 版本 3.13.4