类型: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/。
暂时还没有任何评论。