You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,补充以下核心配置:

  1. 指定交叉编译器
    先通过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")
    
  2. 设置目标系统根文件系统(Sysroot)
    指定包含Linux目标头文件和系统库的路径:

    # 替换为交叉编译器安装目录下的sysroot路径,需匹配实际版本号
    set(CMAKE_SYSROOT "/usr/local/Cellar/x86_64-unknown-linux-gnu/12.2.0/sysroot")
    
  3. 调整路径查找规则
    限制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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:25:43