Arm64 macOS下交叉编译x86_64 Linux二进制CMake报错求助
MacOS下交叉编译Linux x86_64 C库的CMake配置缺失问题
现有工具链文件
darwin.arm64.toolchain.cmake
set(CMAKE_SYSTEM_NAME Darwin) set(CMAKE_SYSTEM_PROCESSOR arm64) set(CMAKE_SYSTEM_VERSION "${CMAKE_HOST_SYSTEM_VERSION}") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER)
darwin.x86_64.toolchain.cmake
set(CMAKE_SYSTEM_NAME Darwin) set(CMAKE_SYSTEM_PROCESSOR x86_64) set(CMAKE_SYSTEM_VERSION "${CMAKE_HOST_SYSTEM_VERSION}") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER)
linux.x86_64.toolchain.cmake
set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR x86_64) set(CMAKE_SYSTEM_VERSION "${CMAKE_HOST_SYSTEM_VERSION}") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE NEVER)
CMake调用命令
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=${ROOT_DIR}/toolchains/linux.x86_64.toolchain.cmake .
报错信息
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - broken CMake Error at /opt/homebrew/Cellar/cmake/3.25.0/share/cmake/Modules/CMakeTestCCompiler.cmake:70 (message): The C compiler "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc" is not able to compile a simple test program. It fails with the following output: Change Dir: /Users/maxgale/X/CMakeFiles/CMakeScratch/TryCompile-xBXBOz Run Build Command(s):/usr/bin/make -f Makefile cmTC_8e560/fast && /Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/cmTC_8e560.dir/build.make CMakeFiles/cmTC_8e560.dir/build Building C object CMakeFiles/cmTC_8e560.dir/testCCompiler.c.o /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -MD -MT CMakeFiles/cmTC_8e560.dir/testCCompiler.c.o -MF CMakeFiles/cmTC_8e560.dir/testCCompiler.c.o.d -o CMakeFiles/cmTC_8e560.dir/testCCompiler.c.o -c /Users/maxgale/X/CMakeFiles/CMakeScratch/TryCompile-xBXBOz/testCCompiler.c Linking C executable cmTC_8e560 /opt/homebrew/Cellar/cmake/3.25.0/bin/cmake -E cmake_link_script CMakeFiles/cmTC_8e560.dir/link.txt --verbose=1 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc CMakeFiles/cmTC_8e560.dir/testCCompiler.c.o -o cmTC_8e560 ld: library not found for -lSystem clang: error: linker command failed with exit code 1 (use -v to see invocation) make[1]: *** [cmTC_8e560] Error 1 make: *** [cmTC_8e560/fast] Error 2 CMake will not be able to correctly generate this project. Call Stack (most recent call first): CMakeLists.txt:3 (project)
问题
请问我缺少哪些配置才能完成这次交叉编译?
问题根源
你在MacOS主机上尝试交叉编译Linux目标,但当前的linux.x86_64.toolchain.cmake未指定Linux交叉编译器,CMake默认使用了MacOS的Xcode clang编译器。该编译器只能生成MacOS可执行文件,链接时会查找MacOS系统库(如-lSystem),而非Linux所需的系统库,导致链接失败。
需补充的配置
要完成Linux交叉编译,需修改linux.x86_64.toolchain.cmake,补充以下核心配置:
指定交叉编译器
先通过Homebrew安装x86_64 Linux交叉编译器,再在工具链文件中指定编译器路径:# 交叉编译器前缀,根据实际安装情况调整 set(CROSS_COMPILE_PREFIX "x86_64-unknown-linux-gnu-") set(CMAKE_C_COMPILER "${CROSS_COMPILE_PREFIX}gcc") set(CMAKE_CXX_COMPILER "${CROSS_COMPILE_PREFIX}g++") set(CMAKE_AR "${CROSS_COMPILE_PREFIX}ar") set(CMAKE_RANLIB "${CROSS_COMPILE_PREFIX}ranlib")设置目标系统根文件系统(Sysroot)
指定包含Linux目标头文件和系统库的路径:# 替换为交叉编译器安装目录下的sysroot路径,需匹配实际版本号 set(CMAKE_SYSROOT "/usr/local/Cellar/x86_64-unknown-linux-gnu/12.2.0/sysroot")调整路径查找规则
限制CMake仅在目标sysroot中查找头文件和库,避免使用主机系统的文件:set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # 主机程序直接使用 set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) # 仅在sysroot找头文件 set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) # 仅在sysroot找库 set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
完整的linux.x86_64.toolchain.cmake示例
# linux.x86_64.toolchain.cmake set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR x86_64) set(CMAKE_SYSTEM_VERSION "${CMAKE_HOST_SYSTEM_VERSION}") # 指定交叉编译器 set(CROSS_COMPILE_PREFIX "x86_64-unknown-linux-gnu-") set(CMAKE_C_COMPILER "${CROSS_COMPILE_PREFIX}gcc") set(CMAKE_CXX_COMPILER "${CROSS_COMPILE_PREFIX}g++") set(CMAKE_AR "${CROSS_COMPILE_PREFIX}ar") set(CMAKE_RANLIB "${CROSS_COMPILE_PREFIX}ranlib") # 设置sysroot路径(替换为实际路径) set(CMAKE_SYSROOT "/usr/local/Cellar/x86_64-unknown-linux-gnu/12.2.0/sysroot") # 调整路径查找规则 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
前置步骤:安装交叉编译器
在MacOS终端执行以下命令安装Linux交叉编译器:
brew install x86_64-unknown-linux-gnu
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

