如何在 Linux 上用 MinGW-w64 交叉编译 GLFW 的 Windows 二进制
【免费下载链接】glfwA multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input项目地址: https://gitcode.com/GitHub_Trending/gl/glfw
如果你有一台 Linux 主机(Ubuntu、Debian 等发行版或 Cygwin),但不想在 Windows 上跑构建,又想拿到可供 Windows 应用链接的 GLFW 库文件,这就是交叉编译要解决的问题:用 MinGW-w64 工具链把 GLFW 源码编译成 Windows 目标的可执行产物。整个过程只需要 CMake 加一个工具链文件,不需要在 Linux 上安装任何 Windows SDK。
前提条件(均来自 编译指南 和 README):
- Linux 主机上已安装 CMake 3.16 或更高版本,GLFW 的 CMake 文件要求 CMake 最低版本为 3.16;
- 已安装 MinGW-w64 交叉编译器。Debian/Ubuntu 系是一个
mingw-w64包同时包含 32 位和 64 位版本,Cygwin 则对应mingw64-i686-gcc(32 位)和mingw64-x86_64-gcc(64 位)两个包; - GLFW 源码树已经拿到手,
cmake -S参数要指向源码树根目录,而不是它的src子目录。
交叉编译不需要 编译指南 里给 Linux 原生构建列的那批 X11/Wayland 开发包——那些只用于编译 Linux 目标。Windows 目标的 GLFW 只使用 Win32 后端,依赖的是 MinGW-w64 工具链自带的 Windows 头文件,工具链文件会通过CMAKE_FIND_ROOT_PATH把它们指到/usr/x86_64-w64-mingw32或/usr/i686-w64-mingw32下。
选择与你的 MinGW-w64 前缀匹配的工具链文件
GLFW 在CMake/子目录里提供了四个现成的工具链文件,分别对应两种位宽和 GCC/Clang 两种编译器:
| 文件 | 目标 |
|---|---|
| CMake/x86_64-w64-mingw32.cmake | 64 位,MinGW-w64 GCC |
| CMake/i686-w64-mingw32.cmake | 32 位,MinGW-w64 GCC |
| CMake/x86_64-w64-mingw32-clang.cmake | 64 位,MinGW-w64 Clang |
| CMake/i686-w64-mingw32-clang.cmake | 32 位,MinGW-w64 Clang |
选哪一个取决于你系统上 MinGW-w64 二进制文件的前缀。文档给出的判断方法是看/usr目录下的前缀名:Ubuntu 和 Cygwin 的 MinGW-w64 包 64 位编译器前缀都是/usr/x86_64-w64-mingw32,32 位是/usr/i686-w64-mingw32。工具链文件内部就是按这个前缀设置的,例如CMAKE_C_COMPILER设为x86_64-w64-mingw32-gcc、CMAKE_RC_COMPILER设为x86_64-w64-mingw32-windres,目标系统设为Windows。如果你发行版安装出来的前缀不同,需要换成与你的前缀一致的工具链文件(或自己照着上面的格式改一个,但注意不要改仓库内容,把它复制到构建流程引用的位置)。
配置:用 -D CMAKE_TOOLCHAIN_FILE 指定工具链
进入 GLFW 源码树,执行标准的 CMake 配置命令,只多一个-D CMAKE_TOOLCHAIN_FILE选项:
cd path/to/glfw cmake -S . -B build -D CMAKE_TOOLCHAIN_FILE=CMake/x86_64-w64-mingw32.cmake这里有两个容易踩的点,文档都明确写了:
path/to/glfw是 GLFW 源码树根目录,不是src子目录;- 工具链文件的路径是相对于
-S传入的源码树路径解析的,不是相对于当前工作目录。所以先cd进源码树、-S传.时,工具链文件直接写CMake/x86_64-w64-mingw32.cmake即可。
配置成功的判断依据:CMake 输出中不再报找不到编译器,并打印后端选择状态。由于目标是 Windows,cmake_dependent_option使 Win32 选项在WIN32条件下默认开启,你会看到Including Win32 support,而 X11/Wayland 不会出现在输出里。
默认结果是静态库:BUILD_SHARED_LIBS默认关闭,产出的是静态 GLFW。想要 DLL,在配置命令里追加一个-D选项即可(可选分支):
cmake -S . -B build -D CMAKE_TOOLCHAIN_FILE=CMake/x86_64-w64-mingw32.cmake -D BUILD_SHARED_LIBS=ON编译
文档给出的通用编译命令是cmake --build,它会运行该构建目录对应的平台特定构建工具,对交叉编译来说是最省事的入口:
cmake --build build不建议手动mingw32-make——mingw32-make在 编译指南 中是作为在 MinGW 环境下编译的说法出现的,而 Linux 主机上直接调用它并不属于文档描述的路径;cmake --build会按工具链文件配置的编译器驱动整个构建。
验证构建产物
构建完成后到构建目录检查产物。按 src/CMakeLists.txt 的逻辑,Windows 目标的输出名固定为glfw3(非 Unix 平台不走soname命名分支):
- 静态构建(默认):
build/src/下出现libglfw3.a; - 共享构建(
BUILD_SHARED_LIBS=ON):同时出现glfw3.dll和导入库glfw3dll.a,DLL 的VERSION属性取库的主.次版本号(当前源码树为 3.5.0)。
由于是在 Linux 上交叉编译出来的 Windows PE 目标文件,可以用常规手段确认产物类型:
file build/src/libglfw3.a file build/src/glfw3.dll输出里出现 Windows/PE 相关字样(如COFF、PE32+)即说明交叉编译按预期生成了 Windows 二进制而不是 Linux 目标文件。
默认情况下示例程序(GLFW_BUILD_EXAMPLES)和测试程序(GLFW_BUILD_TESTS)在独立构建时也是开启的,所以你会一并得到编译好的示例可执行文件,例如build/examples/下的glfwinfo.exe等 Windows PE 可执行文件——它们可以在 Windows 上运行,用来验证交叉出来的 DLL 能正常加载。
限制与后续
- 工具链文件把目标系统写死为
Windows,因此交叉编译产物只覆盖 Win32 后端;Wayland/X11 相关选项对这条路径不适用。 - 如果编译器前缀与四个工具链文件都对不上(非标准安装的 MinGW-w64),配置阶段就会因找不到编译器而失败,此时先核对
/usr下的实际前缀再选文件。 - 拿到
glfw3.dll/libglfw3.a之后,下一步是给 Windows 上的应用链接 GLFW,参见 构建应用指南。
【免费下载链接】glfwA multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input项目地址: https://gitcode.com/GitHub_Trending/gl/glfw
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考