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

机缘

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

工作流

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

  1. 增加个源 (trusty 是linux发行的版本标识,比如22.04是jammy
    Linux(Ubantu)交叉编译生成windows(32位,64位)可执行程序和库_第1张图片
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++.)
Linux(Ubantu)交叉编译生成windows(32位,64位)可执行程序和库_第2张图片

在这里插入图片描述

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

搭建环境

Linux(Ubantu)交叉编译生成windows(32位,64位)可执行程序和库_第3张图片

工具链文件

# 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平台的动态库).

Linux(Ubantu)交叉编译生成windows(32位,64位)可执行程序和库_第4张图片
如果测试需要把程序放在win10上运行,记得关闭win10的实时保护.不然被被当成木马处理.

Linux(Ubantu)交叉编译生成windows(32位,64位)可执行程序和库_第5张图片

你可能感兴趣的:(Linux,linux,windows,运维)