惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
V
Vulnerabilities – Threatpost
Google Online Security Blog
Google Online Security Blog
Hugging Face - Blog
Hugging Face - Blog
L
LINUX DO - 热门话题
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
D
Docker
C
Cyber Attacks, Cyber Crime and Cyber Security
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
T
Tenable Blog
P
Privacy International News Feed
Google DeepMind News
Google DeepMind News
小众软件
小众软件
Cisco Talos Blog
Cisco Talos Blog
aimingoo的专栏
aimingoo的专栏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
A
Arctic Wolf
C
Cybersecurity and Infrastructure Security Agency CISA
C
Cisco Blogs
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
The Hacker News
The Hacker News
Project Zero
Project Zero
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Threatpost
V
Visual Studio Blog
The GitHub Blog
The GitHub Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
Jina AI
Jina AI
Cyberwarzone
Cyberwarzone
The Register - Security
The Register - Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
Vercel News
Vercel News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
MongoDB | Blog
MongoDB | Blog
U
Unit 42
Scott Helme
Scott Helme
A
About on SuperTechFans
WordPress大学
WordPress大学
F
Fortinet All Blogs
大猫的无限游戏
大猫的无限游戏
G
GRAHAM CLULEY
Latest news
Latest news
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
Schneier on Security

老鱼的博客

DOS 内存粗解 - 老鱼的博客 Qt Quick 编译器简介 - 老鱼的博客 激活 Python 虚拟环境 - 老鱼的博客 安装与编译最简 windows qt - 老鱼的博客 如何存储密码(KDF) - 老鱼的博客 静态编译 Qt 简单教程 - 老鱼的博客 bcache 的使用 - 老鱼的博客 Linux 下超频 Ryzen 1700 - 老鱼的博客 怎么样在 virtualenv 里面使用 PyQt - 老鱼的博客
在 openSUSE 底下跨平台编译 mingw64 程序
2022-03-08 · via 老鱼的博客

在 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/。


暂时还没有任何评论。