如何在Windows环境下无需WSL和Docker,使用LLVM与CMake交叉编译至Linux(Ubuntu)
在Windows上用LLVM+CMake交叉编译Linux(Ubuntu)程序(无WSL/Docker)
一、准备必要工具
- 安装LLVM:下载Windows预编译包,确保包含
clang、lld链接器,以及Linux目标对应的内置库(如libclang_rt.builtins-x86_64-linux-gnu.a)。安装后将LLVM的bin目录添加到系统PATH。 - 安装CMake:下载Windows版本并加入系统PATH,确保命令行可调用
cmake。 - 获取Ubuntu系统库:从Ubuntu镜像源下载对应架构(如x86_64)的
libc6-dev、gcc-multilib等包,解压到本地目录(如D:/ubuntu-cross-root),保留原目录结构(usr/include、usr/lib等)。
二、编写CMake交叉编译工具链文件
新建toolchain.cmake文件,内容如下:
# 指定目标系统与架构 set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR x86_64) # 配置LLVM交叉编译器 set(CMAKE_C_COMPILER clang) set(CMAKE_CXX_COMPILER clang++) set(CMAKE_C_COMPILER_TARGET x86_64-linux-gnu) set(CMAKE_CXX_COMPILER_TARGET x86_64-linux-gnu) # 使用LLVM的lld作为链接器 set(CMAKE_LINKER lld) set(CMAKE_C_LINK_EXECUTABLE "${CMAKE_LINKER} <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>") set(CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_LINKER} <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> <LINK_LIBRARIES>") # 指定Ubuntu系统库根目录 set(CMAKE_SYSROOT "D:/ubuntu-cross-root") # 设置查找路径优先级 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)
注意把CMAKE_SYSROOT路径替换为你实际存放Ubuntu系统库的目录
三、配置项目CMakeLists.txt
假设项目结构如下:
my_project/ ├── src/ │ └── main.c ├── CMakeLists.txt └── toolchain.cmake
编写示例CMakeLists.txt:
cmake_minimum_required(VERSION 3.20) project(LinuxCrossDemo C) add_executable(my_app src/main.c) # 若需链接系统库(如pthread),添加以下配置 target_link_libraries(my_app pthread)
四、执行交叉编译
打开Windows命令提示符或PowerShell,进入项目目录执行:
# 创建编译目录 mkdir build && cd build # 用工具链文件初始化CMake cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake # 开始编译 cmake --build .
编译完成后,build目录下的my_app即为Ubuntu x86_64平台的可执行文件,可直接复制到Ubuntu系统运行。
常见问题排查
- 头文件缺失:检查
CMAKE_SYSROOT路径是否正确,确保usr/include下包含完整的系统头文件(如stdio.h)。 - 链接错误:确认
usr/lib下存在对应库文件(如libpthread.so),若需静态编译,可添加set(CMAKE_EXE_LINKER_FLAGS "-static")到CMakeLists.txt。 - 兼容性问题:建议使用LLVM 14及以上版本,对Linux交叉编译支持更完善。
内容的提问来源于stack exchange,提问作者Trilokesh Pradhan
相关产品推荐
相关产品推荐

