Linux(Ubantu)交叉编译生成windows(32位,64位)可执行程序和库

news2024/9/23 3:21:16

机缘

机缘巧合下收到了这个小任务.

工作流

先是找了下资料发现过去的都是关于mingw32. 教程的做法:

  1. 增加个源 (trusty 是linux发行的版本标识,比如22.04是jammy
    在这里插入图片描述
deb http://us.archive.ubuntu.com/ubuntu trusty main universe
  1. 更新源
sudo apt update
  1. 下载mingw32.
sudo apt install mingw32

结果发现在源里根本找不到mingw32
报错 Unable to locate package mingw32

最后发现 ubantu高于15.04的版本mingw32不可用,这也就是上面找不到这个的原因.毕竟现在是2024年1月10日18:06分(已经下班了),一般的版本都在20.04上.


关于mingw-w64
从 Ubuntu 15.04 版本开始,mingw32 工具链不再提供,取而代之的是 mingw-w64。mingw-w64 是一个跨平台的 C/C++ 编译器,可以在 Linux 或其他操作系统上编译 Windows 应用程序。与 mingw32 相比,mingw-w64 提供了对 64 位 Windows 应用程序的支持,并且通常被认为是更现代和更新的工具。

如果您需要在 Ubuntu 系统上安装 mingw-w64,可以通过以下命令进行:

sudo apt-get update
sudo apt-get install mingw-w64

在使用 mingw-w64 编译 Windows 程序时,您应该使用新的目标前缀 i686-w64-mingw32(用于 32 位应用程序)和 x86_64-w64-mingw32(用于 64 位应用程序),取代原来的i586-mingw32msvc前缀。例如,如果您想要编译一个 32 位的 Windows 应用程序,您可以使用如下命令:

i686-w64-mingw32-gcc -o myapp.exe myapp.c

下载完成后在 /usr/bin下可以看到:(32位和64位的交叉工具链,mingw-w64这个包提供了交叉编译生成32位或者是64位的gcc和g++.)
在这里插入图片描述

在这里插入图片描述

类似于我们平时习惯交叉编译生成arm或者是riscv架构的库和程序,我使用cmake来进行构建测试程序.这也就是主题在LINUX交叉编译生成win32,win64的可执行程序或库

搭建环境

在这里插入图片描述

工具链文件

# cross compile settings
set(CMAKE_SYSTEM_NAME Windows)

#####
##### change following env according to your installation.
#####
 
message(STATUS "cross compile for windows_32 ")
set(TOOLCHAIN_PATH  /usr)
set(CMAKE_C_COMPILER ${TOOLCHAIN_PATH}/bin/i686-w64-mingw32-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PATH}/bin/i686-w64-mingw32-g++)
 
set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
 
 


CMakeLists.txt

set(CMAKE_TOOLCHAIN_FILE  ${CMAKE_CURRENT_SOURCE_DIR}/mingw32_64_toolchain.cmake) 

project(mingw32_test)
set(APP "mingw32test")
cmake_minimum_required(VERSION 3.5)
# opencv4 requires c++11
set(CMAKE_CXX_STANDARD 11)

add_library(${APP} SHARED test.cpp)


add_executable(mytest  main.cpp )
target_link_libraries(mytest  mingw32test)




main.cpp生成交叉编译生成的依赖库的可执行文件

#include "iostream"
int test();
int main()
{
    std::cout<<"test\r\n";
    test();
    return 0;
}


test.cpp 交叉编译生成win32上的动态库

#include "iostream"

int test()
{
	std::cout << "this is dll test\r\n";
	return 0;
}

需要注意的地方

关于下面两行代码

set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")

因为mingw-w64编译器不认识 -rdynamic 这个命令行选项。这个选项通常用于 Unix-like 系统的编译器,用以指导链接器在生成可执行文件时保留符号信息,以便支持运行时的符号解析(例如用于动态加载库).该选项对于 Windows 下的编译是无效的,通过上面两行代码的设置清除CMake 为了 Unix-like 系统默认添加的链接标志。

最后在build目录在执行 make clean all -j8 即可生成win32平台的库和可执行程序.
如果我们使用的linux环境又安装wine解释器(能够解析windows平台的可执行程序) 则能直接允许直接在linux环境中运行我们生成的win32的可执行程序(包括验证win32平台的动态库).

在这里插入图片描述
如果测试需要把程序放在win10上运行,记得关闭win10的实时保护.不然被被当成木马处理.

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1381050.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阅读笔记lv.1

阅读笔记 sql中各种 count结论不同存储引擎计算方式区别count() 类型 责任链模式常见场景例子&#xff08;闯关游戏&#xff09; sql中各种 count 结论 innodb count(*) ≈ count(1) > count(主键id) > count(普通索引列) > count(未加索引列)myisam 有专门字段记录…

通过shell脚本确定当前平台

shell中的变量OSTYPE存储操作系统的名称&#xff0c;也可以使用uname命令来确认当前所在的平台。 shell中的变量HOSTTYPE存储操作系统的架构。 测试代码如下所示&#xff1a; #! /bin/bashecho "use OSTYPE:" if [[ "$OSTYPE" "linux-gnu&quo…

java大学生宿舍共享厨房系统宿舍自习室宿舍洗衣房系统源码包含技术文档

主要功能&#xff1a;学生可注册登录&#xff0c;预约自己宿舍楼栋的共享厨房和评价&#xff0c;也可以使用该楼栋的洗衣房&#xff0c;查看洗衣机吹风机的使用情况和报修&#xff0c;还可以进入该楼栋自习室打卡和评价。管理员可管理所有的学生和宿管&#xff0c;分配宿舍&…

MYSQL的操作

1.库的操作 1.1创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 说明&#xff1a; #…

GitHub项目推荐-incubator

项目地址 Github地址&#xff1a;GitHub - apache/incubator-anser 官网&#xff1a;Apache Answer | Free Open-source Q&A Platform 项目简述 这是Apache的一个开源在线论坛&#xff0c;也可以部署成为一个自有的QA知识库。项目主要使用了Go和Typescript来开发&#…

Feature Fusion for Online Mutual KD

paper&#xff1a;Feature Fusion for Online Mutual Knowledge Distillation official implementation&#xff1a;https://github.com/Jangho-Kim/FFL-pytorch 本文的创新点 本文提出了一个名为特征融合学习&#xff08;Feature Fusion Learning, FFL&#xff09;的框架&…

设计模式—— 单例设计模式

单例设计模式 什么是单例模式 单例模式是一种对象创建型模式&#xff0c;使用单例模式&#xff0c;可以保证为一个类只生成唯一的实例对象。也就是说&#xff0c;在整个程序空间中&#xff0c;该类只存在一个实例对象。 为什么使用单例模式 在应用系统开发中&#xff0c;我…

Python测试开发,掌握技巧更上一层楼!

学员学习分享&#xff1a; 自动化测试工作稳定之后&#xff0c;一向对技术着迷的我&#xff0c;迫不及待地要进入测开的世界&#xff0c;在java和Python的方向上&#xff0c;我选择了Python。 原因很简单&#xff0c;比较好上手&#xff0c;而且市场上也比较主流。 在跟着课…

【操作系统】在阅读论文:OrcFS: Orchestrated file system for flash storage是需要补充的基础知

在阅读论文&#xff1a;OrcFS: Orchestrated file system for flash storage是需要补充的基础知识 这篇论文是为了解决软件层次之间的信息冗余问题 To minimize the disk traffic, the file system buffers the updates and then flushes them to the disk as a single unit, …

二极管限幅电路理论分析,工作原理+作用

一、限幅是什么意思&#xff1f; 限幅也就是&#xff0c;将电压限制在某个范围内&#xff0c;去除交流信号的一部分但不会对波形的剩余部分造成影响。通常来说&#xff0c;限幅电路主要是由二极管构成&#xff0c;波形的形状取决于电路的配置和设计。二、限幅电路工作原…

流量预测中文文献阅读(郭郭专用)

目录 基于流量预测的超密集网络资源分配策略研究_2023_高雪亮_内蒙古大学&#xff08;1&#xff09;内容总结&#xff08;2&#xff09;流量预测部分1、数据集2、结果对其中的一个网格的CDR进行预测RMSE和R2近邻数据和周期数据对RMSE的影响 &#xff08;3&#xff09;基于流量预…

C语言实现简易n子棋小游戏(代码含注解)

利用C语言简单实现一个n子棋小游戏&#xff0c;棋盘大小由自己定义 将源文件分为 执行游戏的测试文件(test.c)和保存游戏运行逻辑的相关函数的文件(game.c) 头文件中声明符号和函数的定义(game.h) 游戏执行主要依靠二维数组实现&#xff0c;电脑走棋采用随机值的方法简易地…

【NI-DAQmx入门】LabVIEW中DAQmx同步

1.同步解释 1.1 同步基础概念 触发器&#xff1a;触发器是控制采集的命令。您可以使用触发器来启动、停止或暂停采集。触发信号可以源自软件或硬件源。 时钟&#xff1a;时钟是用于对数据采集计时的周期性数字信号。根据具体情况&#xff0c;您可以使用时钟信号直接控制数据采…

ElasticSearch概述+SpringBoot 集成 ES

ES概述 开源的、高扩展的、分布式全文检索引擎【站内搜索】 解决问题 1.搜索词是一个整体时&#xff0c;不能拆分&#xff08;mysql整体连续&#xff09; 2.效率会低&#xff0c;不会用到索引&#xff08;mysql索引失效&#xff09; 解决方式 进行数据的存储&#xff08;只存储…

ssm基于Javaweb的物流信息管理系统的设计与实现论文

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统物流信息管理难度大&#xff0c;容错率低&#xff0c;管理…

基于OpenCV的谷物颗粒识别

基于OpenCV的谷物颗粒识别 一、程序整体功能介绍1.1 导入库与函数定义1.2 颜色分割与灰度处理1.3 二值化与轮廓检测1.4 绘制与计数1.5 主程序与结果展示 二、算法原理与实现流程2.1算法原理&#xff08;1&#xff09;颜色分割&#xff08;2&#xff09;灰度处理与二值化&#x…

mysql进阶 - 存储过程

目录 1. 用途&#xff1a; 2. 相关语法 2.1 创建 2.1.1 语法 2.1.2 示例 2.2 查看存储过程 2.3 调用 2.4 修改存储过程 2.5 删除存储过程 1. 用途&#xff1a; 存储过程广泛存在于一些遗留系统&#xff0c;可以减少代码的编写。而近些年&#xff0c;存储过程很少再用…

【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】

前言 大家好吖&#xff0c;欢迎来到 YY 滴C考前速过系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《…

试用统信服务器操作系统UOS 20

作者&#xff1a;田逸&#xff08;formyz&#xff09; 试用统信Linux操作系统UOS&#xff0c;想了解一下用已有的Linux经验能否轻松驾驭它。以便在某些场景下&#xff0c;可以多一种选择。本次试验在Proxmox VE 8&#xff08;以下简称PVE 8&#xff09;平台下进行&#xff0c;采…

杨中科 .NETCORE ENTITY FRAMEWORK CORE-1 EFCORE 第一部分

一 、什么是EF Core 什么是ORM 1、说明: 本课程需要你有数据库、SOL等基础知识。 2、ORM: ObjectRelational Mapping。让开发者用对象操作的形式操作关系数据库 比如插入: User user new User(Name"admin"Password"123”; orm.Save(user);比如查询: Book b…