从Windows到Linux的C++交叉编译器

neo*_*x3m 43 c++ linux windows cross-compiling

是否有任何用户友好的工具可以从Windows交叉编译到Linux?

Ben*_*igt 33

crosstool-ng支持使用cygwin主机构建交叉编译器.

概述:

  • 使用开发包安装cygwin
  • 下载 crosstool-ng
  • 提取tarball(tar xvjf crosstool-ng*)
  • ./configure
  • 当配置抱怨缺少的工具,回去Cygwin的设置和安装相应的包(例如flex,libtool,ncurses-devel)你需要至少以下几点:
    • 用devel /的gperf
    • 用devel /野牛
    • 用devel/byacc
    • 用devel/wget的
    • 用devel /补丁
    • 开发/制作(GNU版)
    • Devel/automake 1.10+
    • 利布斯/ libncursesw10
    • 利布斯/ libncursesw10-devel的
  • make
  • make install
  • 创建一个用于构建交叉编译器的新目录,例如 /usr/src/cross-linux-gnu-root
  • 在注册表中启用系统范围的区分大小写支持(请参阅https://superuser.com/questions/266110/how-do-you-make-windows-7-fully-case-sensitive-with-respect-to-the- filesystem#answer-842670)
  • 区分大小写的目录(例如mount c:/cygwin/usr/src/cross-linux-gnu-root /usr/src/cross-linux-gnu -o binary,posix=1)
  • 从交叉编译器构建目录中, ct-ng menuconfig
  • 在菜单中,将目标体系结构设置为x86(可能)和子体系结构i686(避免GCC 4.8问题,感谢osm0sis),将目标内容设置为linux目标C库glibc,并启用C++编译器.
  • 要解决make 4.0问题,也可以启用实验Paths and misc options,进入Companion tools(顶级)并启用Build some companion tools然后make 3.81(感谢osm0sis)
  • wget有最新的kernel.org证书问题,所以在这个接受的答案中使用.wgetrc方法:如何在Cygwin中的HTTPS URL上运行wget时修复证书错误?(谢谢osm0sis)
  • 目前需要3个文件补丁以避免进一步的错误:
  • ct-ng build

当然,这不会使您能够从Visual Studio内部构建Linux应用程序.(VS2010及更高版本允许您使用其他工具链(如gcc)进行构建,但除了由crosstool-ng构建的交叉编译器之外,您还需要适当的工具链描述).但是你有一个工作g++-linux-gnu,你可以直接运行或使用Makefile.

注意:构建交叉编译器需要很长时间.osm0sis 在这里提供了一个预构建的gcc 4.8.1,以及他关于构建交叉编译器的注释(用于更新这个答案).

  • 什么是"Windows/Linux"二进制文件?AFAIK,mingw只是gcc-for-windows,并且是PE可执行文件.Linux二进制文件必须采用与Linux兼容的格式,其中ELF最受欢迎.我现在处于'ct-ng build'步骤的中间,试图确保我的答案尽可能完整,并包括解决方案.是的,我正在构建的编译器将生成ELF可执行文件,这些可执行文件与glibc(以及其他适当的库)动态链接. (5认同)

Aus*_*amb 0

您是否需要一些可以将编写的在 Windows 上运行的代码变成在 Linux 上运行的东西?确实没有一个编译器可以做到这一点 - 但也许您正在寻找 Wine ( http://www.winehq.org/ ),它可以让您在 Linux 上运行 Windows 应用程序(如果它们使用 Wine 已经淘汰的 API)。

编辑:我假设您的代码在此答案中使用 Windows API(Win32 等)。如果您仅使用标准 C++ 和跨平台可用的库,那么还有很多其他答案。

  • 如果代码中充满了 Win32 主义,“winelib”是一个很好的建议。但说没有编译器来构建 Linux 二进制文件是胡说八道。 (3认同)
  • 要构建能够神奇地超越所有 Windows API 的 Linux 二进制文件吗?我认为没有编译器可以做到这一点是一个有效的说法 - 从一个操作系统获取 API 在另一个操作系统上同样工作不是编译器的工作。 (3认同)