在 openSUSE 底下跨平台编译 mingw64 程序


类型:LinuxApp,C++ & Qt4,创建时间:March 8, 2022, 9:01 p.m.

标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/112/。

在 openSUSE Leap 15.3 底下跨平台编译 mingw64 程序,只要安装跨平台编译的安装包就行了:

sudo zypper in mingw64-cross-gcc-c++

这条命令会安装一个在 linux 里面可执行的 gcc 编译器到 /usr/bin 里面:

/usr/bin/x86_64-w64-mingw32-gcc
/usr/bin/x86_64-w64-mingw32-g++
/usr/bin/x86_64-w64-mingw32-gcc-ar
/usr/bin/x86_64-w64-mingw32-strip
/usr/bin/x86_64-w64-mingw32-ld
/usr/x86_64-w64-mingw32/bin/*

但上面只是编译器,除了能编译 1+2 这种平台无关的代码之外没什么用,连 printf() 都不支持。真正要编译 windows 程序的话还需要标准库以及 windows 相关的头文件。所以 zypper 会自动一起安装以下软件包:

libfl2
mingw64-cross-cpp
mingw64-cross-binutils
mingw64-filesystem
mingw64-headers
mingw64-libwinpthread1
mingw64-runtime
mingw64-winpthreads-devel

以上几个软件包里面包含 mingw64 核心的 lib, include 文件,被安装到 mingw 的 sys-root 里面:

/usr/x86_64-w64-mingw32/sys-root

当我们的 windows 程序被编译的时候,编译器被配置到自动在这个地方找头文件和库文件。接下来我们就来操作一下:

// main.c
#include <stdio.h>
void main() { printf("hello, world!\n"); }

然后运行:

$ x86_64-w64-mingw32-gcc -o test003.exe main.c
$ wine ./test003.exe

可以看到打印出结果。

openSUSE mingw64 包还带了一系列脚本,比如mingw64-cmake命令,可以代替cmake命令,编译的时候设置使用 mingw64 的编译器。使用也很简单:

# CMakeLists.txt
project(test003 LANGUAGES C)
add_executable(test003 main.c)

比如上面这个 cmake 工程文件,搭配main.c,我们来编译它们:

$ mkdir build
$ mingw64-cmake ..
$ make
$ wine ./test003.exe

它的原理应该是使用了 cmake 的 toolchain 文件,不然就设置了CC环境变量之类的。

我们还有另外一种办法,创建 toolchain 文件:

# mingw64.toolchain
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR x86_64)
set(CMAKE_SYSROOT /usr/x86_64-w64-mingw32/sys-root/mingw/)
set(CMAKE_C_COMPILER /usr/bin/x86_64-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/x86_64-w64-mingw32-g++)
# 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 的时候指定这个 toolchain 变量

$ cd build
$ cmake --toolchain=../mingw64.toolchain ..
$ make
$ wine test003.exe

不过我们也可以看到这种跨平台环境还缺少很多东西。需要我们自行安装。

此外,可以用mingw64-configure命令来代替正常的configure,此外还有mingw64-make命令。

然后试了一下,并不能编译成功 Qt,我猜是因为 qt 在编译过程中会生成 qmake,然后调用 qmake 真正执行。目前 qt6 已经支持 cmake 了,或许可以成功吧。我还没有试验过。

篇外1

在 openSUSE 里面还有个 mingw64-gcc 的包。安装这个包并没有什么卵用,因为它往x86_64-w64-mingw32/sys-root/mingw/里面安装gcc.exe, g++.exe这些程序,只能用于 wine 环境。

篇外2

openSUSE Leap 15.3 还带了一系列的跨平台编译器。可以用zypper search cross命令找出来,比如安装zypper install cross-arm-gcc7之后,就会出现arm-suse-linux-gnueabi-g++这个编译器,可以把源代码编译到这个平台。但是实际上并不能成功,会缺少各种头文件和库文件。怀疑这个编译器是给内核使用的吧?

标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/112/。


暂时还没有任何评论。


何不来发表一下您对本文的看法(使用Markdown语法,分段空两行):