我为 Ubuntu 编写了一个小应用程序,它运行良好。我对为 Windows 进行交叉编译很感兴趣。
我已经mingw32
从存储库安装了它,它可以很好地编译简单的文件。但是,我想要为 Windows 编译的应用程序使用了一些 UNIX 特定的机制 - 例如,它利用了系统/套接字.h文件,并且 mingw 编译器声称找不到它。
一个解决方案是在 Windows 机器上安装 Cygwin,然后尝试从那里编译应用程序,使用赛格威可执行文件。不幸的是,我无法访问任何 Windows 计算机,因为我没有那个系统的副本。如果我能以某种方式在我的 Ubuntu 上使用 Cygwin(及其库和标头)来编译 .exe 文件,那就太完美了。
存储库中没有包含该软件包的包。谁能告诉我如何在 Ubuntu 上使用 Cygwin?
答案1
Cygwin 是一个 Windows 程序,它允许你在 Windows 中运行 Linux 程序,因此它不会使任何将其放在存储库中是有意义的。
我认为你完成这项工作的唯一机会就是在 wine 中运行 cygwin。
听起来你有两个不同的问题:
- 我可以在 Ubuntu 下运行 Cygwin 来测试我想要构建的 Windows 版本吗?
- 如何找到与 mingw32 一起使用的 Windows 库来替换我一直在使用的 Linux 库?
正如我上面所说,对于 1,是的,您应该能够在 wine 中运行 cygwin 进行测试。
问题 2 不相关,应移至其他问题。(无论如何,我不知道问题 2 的答案是什么)。
答案2
你尝过葡萄酒吗?
无论如何,你可以使用 Virtual Box 和90 天试用版 Windows 7,但前提是你的应用程序不是商业性的;)
答案3
Cygwin 交叉编译器可在 Fedora/EPEL 上使用自定义 repo (Copr) –https://copr.fedorainfracloud.org/coprs/yselkowitz/cygwin– 因此原则上它也可以在 Ubuntu 上运行。我不知道您是否可以在 Ubuntu 上安装 Fedora/EPEL cygwin,以及它是否可以工作(您可以尝试使用 alien 将 RPM 转换为 deb 并安装它)。否则,您可以研究 RPM 规范文件以获取有关如何在 Ubuntu 上从源代码构建它的提示。
请注意,Cygwin 有三个部分 - 工具链、运行时 DLL 和移植包。除非您使用 Wine,否则运行时 DLL 和移植包将无法在 Linux 下工作,并且由于 Wine 对 Windows API 的模拟存在限制,可能无法可靠地工作(具体取决于您使用它们的目的)。工具链可以作为交叉编译器为 Linux 编译,然后您可以使用它从 Linux 编译 Cygwin 可执行文件。如果您拥有仅限 Linux 的 CI 环境,如果您拥有大量 Linux 主机而 Windows 主机不足等,这可能会很有用。(尝试在 Wine 下运行工具链可能会成功,尽管上次我尝试在 Wine 下运行 Cygwin 可执行文件时,它抱怨我为我的 Windows 版本使用了错误的 cygwin1.dll 版本 - 也许使用较新的 Wine 可以解决这个问题。)
无论如何,我设法在 Ubuntu 19.10 上的 chroot 中安装了 Fedora 33,然后在该 Fedora chroot 中安装并运行 Cygwin 工具链——请参阅以下脚本。请注意,由于 Ubuntu 20.04 中删除了 yum,因此这在 Ubuntu 20.04 或更高版本上不起作用。可能有一种不那么黑客的方法,比如使用 Fedora Docker 容器,或者尝试使用 Alien 直接在 Ubuntu 上安装 Fedora RPM。
致谢:以下脚本部分摘自这个答案
#!/bin/bash
set -xue
# Script to install Fedora 33 in a chroot on Ubuntu
# And then in turn install cygwin64-gcc in that chroot
# Finally we test we can compile a .exe with Cygwin
#
# Run this as root
#
# Works on Ubuntu 19.10
# Configuration
fedoraver=33
chroot=/fedora${fedoraver}
rpminst=/tmp/rpminst
server=https://download.fedoraproject.org
serverpath=pub/fedora/linux/releases/${fedoraver}/Everything/x86_64/os/Packages/f
serverfile=fedora-repos-${fedoraver}-1.noarch.rpm
# Install yum and yumdownloader
apt install -y yum yum-utils
# Create our chroot
mkdir -p $chroot
# Download and install the fedora-repos package
wget $server/$serverpath/$serverfile
rpm -i --nodeps --force --root=$chroot $serverfile
# Ubuntu's RPM is too old for python-pip-wheel package
# So says YUM. But it works anyway if you do it manually
mkdir -p ${rpminst}
yumdownloader --installroot=$chroot --releasever=${fedoraver} --destdir=${rpminst} python-pip-wheel
rpm -i --nodeps --force --root=$chroot ${rpminst}/*.rpm
# Install DNF and core plugins
yum --installroot=$chroot --releasever=${fedoraver} install -y --nogpgcheck dnf dnf-plugins-core
# Ensure we can resolve DNS
rm -f $chroot/etc/resolv.conf
cp /etc/resolv.conf $chroot/etc
# Enable cygwin DNF repository
chroot $chroot dnf --releasever ${fedoraver} copr enable -y yselkowitz/cygwin
# Install cygwin64-gcc
chroot $chroot dnf --releasever ${fedoraver} install --nogpgcheck -y cygwin64-gcc
# Create test.c
echo $'#include<stdio.h>\nint main(int argc,char**argv){printf("Hello World!\\n");return 0;}' > $chroot/test.c
# Compile test.c
chroot $chroot x86_64-pc-cygwin-gcc -o test.exe test.c