机缘巧合下收到了这个小任务.
先是找了下资料发现过去的都是关于mingw32. 教程的做法:
jammy
deb http://us.archive.ubuntu.com/ubuntu trusty main universe
sudo apt update
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的实时保护.不然被被当成木马处理.