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

54

有没有适用于Windows到Linux的用户友好型跨编译工具?


15
有趣:所有通过 VS IDE 进行的操作都让我感到困惑 - 需要进行大量配置才能让它正常工作。 在 Linux 上就简单多了,不需要这些! - Jonathan Leffler
9
通常,“从X到Y的交叉编译器”意味着“一个编译器在X上运行,但生成在Y上运行的二进制文件”。所以你需要一款在Windows上运行且能生成Linux二进制文件的编译器。这是你想要的吗?通常的方法是在Linux上编译Linux。进行交叉编译的通常原因是Y不是可行的开发环境(例如因为它是手机、机顶盒、Roomba等),也许你最好找一个适合自己的Linux IDE? - Steve Jessop
3
H.Josef,你能用在Windows下运行的编译器为AVR u控制器编译代码,却不能使用在Windows下运行的编译器为Linux编译代码?我不相信。 - neo_x3m
1
据我所知,您可以使用任何编译器编译标准的C++代码,但是在完全不同的操作系统上创建库(并对其进行测试)是很麻烦甚至不可能的。曾经我尝试使用MingW创建和测试一个动态Linux库(.so),但它没有成功,即使使用Cygwin也无法成功,因为Windows环境与Linux非常不同。 - Y.H.
2
运行 Linux 二进制文件会非常麻烦,但如果你拥有所有的 libs/OBJ 格式都是 Linux 的话,编译并不是什么神奇的事情... 如果一个 Linux 编译器应用程序可以在 Windows 上运行,为什么它不能工作呢?为什么你甚至不能在 Windows 下编译一个 Linux 编译器呢? - Mr. Boy
显示剩余5条评论
5个回答

35

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

概述:

  • 以区分大小写的方式挂载目录(例如: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方法:How do I fix certificate errors when running wget on an HTTPS URL in Cygwin?(感谢osm0sis)
  • 目前需要使用3个文件补丁来避免进一步错误:
  • ELF头文件 (感谢Duncan Calvert和osm0sis)
  • ct-ng build
  • 当然,这并不能让您在Visual Studio内构建Linux应用程序。(VS2010及更高版本允许您使用其他工具链(如gcc)进行构建,但您需要一个适当的工具链描述以及由crosstool-ng构建的交叉编译器)。但是您将拥有一个可工作的g++-linux-gnu,您可以直接运行它或使用Makefile运行。

    注意:构建交叉编译器需要很长时间。osm0sis提供了此处的预构建gcc 4.8.1,以及他关于构建交叉编译器的笔记(用于更新此答案)。


    6
    “Windows/Linux”二进制文件是什么?据我所知,mingw只是针对Windows的gcc编译器,可以生成PE可执行文件。而Linux二进制文件必须采用兼容Linux的格式,其中ELF是最流行的格式。我现在正在进行“ct-ng build”步骤,试图确保我的答案尽可能完整,并包括沿途任何问题的解决方案。是的,我正在构建的编译器将生成动态链接到glibc(和其他适当库)的ELF可执行文件。 - Ben Voigt
    用户Osmosis提到,如果ct-ng构建无法下载组件包,则https://dev59.com/2Gox5IYBdhLWcg3wazmR可能会有所帮助。 - Ben Voigt
    有没有类似的交叉编译步骤文档,可以使用在 Windows 上的 clang 生成在 Linux 上运行的二进制文件? - Raman Sharma
    使用osm0sis的预构建版本时出现问题-当我尝试提取档案时,我收到了警告,指出某些文件已经存在于文件夹中。这是因为一些标头(我不知道它们有多重要)的名称仅在情况上不同。我不确定这个问题有多重要。 - Amomum
    这可能是一个“好”的开端,但通常你想做什么?在大多数情况下,您希望为Linux目标系统(可能是Linux发行版,例如opensuse 13.2)开发一些Linux应用程序。如果您想编译Linux发行版,则需要使用与目标系统相同内核版本和相同glibc库的交叉编译器,并复制目标发行版的文件系统。 - sancelot
    显示剩余8条评论

    1

    在Windows上通过CoLinux本地编译生成Linux可执行文件,无需使用虚拟化或交叉编译器,也无需离开(重新启动)Windows。通过Cooperative Linux,在Windows下进行C/C++编译以供Linux使用。Alt+Tab可以实现最快速的切换操作系统(无需重启或重新启动):

    1. 安装CoLinux
    2. 使用CoLinux根文件系统镜像:Ubuntu-9.04-1gb.7z
    3. 启动CoLinux
    4. 使用以下命令将字符串archive.ubuntu.com更改为old-releases.ubuntu.com
    $ sudo vi /etc/apt/sources.list
    

    更新您的配置:
    $ sudo apt-get update
    
    1. 安装两个软件包以便能够编译您的程序(c/c++,gcc编译器,mysql dev 5.1):
    $ sudo apt-get install build-essential
    $ sudo apt-get install libmysqlclient15-dev
    

    从CoLinux访问Windows目录:
    $ mount cofs0 /mnt/ -t cofs
    $ cd /mnt
    
    1. 编译
    $ c++ your.source.cc -o executable.name
    

    协作式Linux目前还不支持x64架构。 - Hamid Rouhani

    1

    你最好使用跨平台的IDE,比如Code::Blocks,它可以导入MSVC项目,并为Linux生成Makefile,然后你可以在Linux上运行(甚至是同一个程序,如果你愿意的话)。

    因此,你的工作流程应该类似于以下内容:

    Code, Compile, and debug on MSVC -> import into Code::Blocks & generate Makefile
    -> test compile and debug with GCC
    -> copy to Linux with Code::Blocks -> test compile & debug on Linux
    

    这可能有点难懂,但至少Code::Blocks可以通过生成Makefiles等方式处理许多这些小细节。


    0

    你是在寻找一种可以将编写的Windows代码转换为Linux代码并运行的工具吗?实际上并没有这样的编译器,但也许你正在寻找Wine(http://www.winehq.org/),它可以让你在Linux上运行Windows应用程序(如果它们使用了Wine已经处理过的API)。

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


    3
    如果代码中充斥着 Win32 代码,那么 "WineLib" 是一个不错的建议。但说没有编译器可以生成 Linux 二进制文件是胡说八道。 - Ben Voigt
    3
    构建可以神奇地消除所有Windows API的Linux二进制文件?我认为说没有编译器可以做到这一点是一个有效的陈述-让一个操作系统的API在另一个操作系统上完全相同的工作不是编译器的职责。 - Austin Lamb

    -3

    我不相信有任何编译器可以让你在Windows上进行编译,然后将生成的二进制文件运行在Linux机器上。你最好是设置两个开发环境,一个在Windows上,一个在Linux上。如果适合您,可以在Windows环境中进行大部分开发和调试,然后经常在Linux下进行编译和测试,以确保您的代码真正具有跨平台性。您还需要使用跨平台的构建系统和测试框架。我建议分别使用 cmake Google Test


    3
    g++支持大量的交叉编译和加拿大交叉编译配置。 - Ben Voigt
    我仍然强烈建议设置跨平台构建系统,然后在每个目标平台上进行本地构建。设置虚拟机比下面描述的crosstool-ng选项要容易得多。不仅如此,像CMake这样的工具还允许您在Windows上使用VS进行调试,这正是OP所喜欢的。 - Darryl
    2
    这个答案是错误的。在Windows上编译Linux代码有多种选择。最大的问题是处理库文件。例如,在Cygwin上构建的程序可能需要版本为5.4.7的libphp5.so,而Ubuntu可能只有5.4.8的版本。这并不是什么大问题,只需在Ubuntu上编译5.4.7版本的库文件即可解决,但这并不是一个简单的解决方案。 - JSON
    @JSON,虽然你说的没错,有一些我不知道的选项,但你给出的例子不是其中之一。为Cygwin编译的二进制文件在Linux上无法运行。请参见https://dev59.com/tm855IYBdhLWcg3wy3kb。 - Darryl
    1
    @Darryl - Android NDK是一个基于Cgywin的交叉编译器的良好示例,它可以在Windows上构建与Linux兼容的二进制文件。虽然它们不是标准的Cgywin库,但这正是任何交叉编译器的目的所在。 - JSON

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接