如何在 Linux 或 Windows 中为 OS X 编译?

     2023-03-17     108

关键词:

【中文标题】如何在 Linux 或 Windows 中为 OS X 编译?【英文标题】:How to Compile for OS X in Linux or Windows? 【发布时间】:2010-10-16 04:32:43 【问题描述】:

我想将我的 C/C++ 应用程序移植到 OS X。

我没有 Mac,但我有 Linux 和 Windows。有这方面的工具吗?

【问题讨论】:

【参考方案1】:

对于 Linux,有一个预构建的 GCC 交叉编译器(来自公开可用的 Apple 修改后的 GCC 源)。

https://launchpad.net/~flosoft/+archive/cross-apple

2015 年更新

    经过这么多年,行业标准 IDE 现在支持 OSX/iOS/Android。

http://channel9.msdn.com/Events/Visual-Studio/Connect-event-2014/311

    Embarcadero 的 RadStudio 还支持在 Windows 上构建 OSX/iOS/Android 应用程序。

    Thomas 的这个answer 还提供了交叉编译工具。

对于所有这些选项,您仍然需要一个真正的 mac/i 设备来测试应用程序。

【讨论】:

效果如何?例如,它是否允许为 MacOSX 编译 Qt? 这是一个完全有效的 GCC 4.2,能够编译大型库。但是,它尚未针对 10.7、10.8 或 10.9 SDK 进行更新,因此现在可以认为它已过时。我一直用它在 C/C++ 中编译我自己的项目,只是为了测试它是否可以移植并修复一些明显的不兼容问题,然后我在真正的 mac 上构建了它。 如何在 Fedora 上安装它? @panzi:我只在 CrunchBang(Debian 的一个变种)上使用过它,也许你应该解压缩 .deb 档案并尝试配置路径。或者,像往常一样,尝试编译源代码。也许这个答案现在提供了更好的选择:***.com/a/19891283/1182653 不幸的是,虽然微软宣布 Visual Studio Connect 支持包括 clang 在内的其他编译器,但我找不到任何关于如何实际定位 MacOS 的信息。【参考方案2】:

我创建了一个名为 OSXCross 的项目,旨在针对 Linux 上的 OS X (10.4-10.9)。

它目前支持clang 3.2 到 3.8(主干)(你可以使用你的 dist 的clang)。 此外,您还可以构建最新的香草GCC (4.6+)。

LTO 也适用于 clangGCC

目前使用 cctools-870 和 ld64-242。

https://github.com/tpoechtrager/osxcross

【讨论】:

我已经使用了你的项目,它确实做到了它的承诺。使用最新的 XCode (7.1) 和最新的 OSX (10.11.1) 测试。【参考方案3】:

似乎已经编写了some scripts,以帮助您为 Mac 设置交叉编译;我不能说它们有多好,或者对你的项目有多适用。在文档中,他们引用these instructions 用于10.4 的交叉编译,these ones 用于10.5 的交叉编译;这些说明可能比脚本更有帮助,具体取决于脚本是否适合您的需求。

如果您的程序是免费或开源软件,那么您可能希望创建一个MacPorts 端口文件(文档here),并允许您的用户使用MacPorts 构建您的程序;这通常是在 Mac OS X 上安装便携式免费或开源软件的首选方式。过去,MacPorts 可以在 Linux 上运行,因此可以在 Linux 上开发和测试您的 Portfile(尽管它显然需要在 Mac 上测试)。

【讨论】:

现在还是自制而不是 macports。 @jcoffland 不,反过来。它用于在 Linux 上构建 OS X 应用程序。阅读标题。 “交叉编译 on Linux for Mac OS X 10.3 - 10.5”(强调)。请注意,这个答案现在已经很老了(差不多 7 岁了,哎呀!),下面的后面的答案有更多的最新信息。【参考方案4】:
    获取“VMware Player” 获取“Mac OS X vm image” 在新操作系统上编译/调试/集成并测试您的代码,以确保一切正常

当您尝试在多个平台上运行时,您绝对必须在预期平台上编译/运行/集成/测试。您不能只在一个平台上编译/运行,然后说“哦,它应该在另一个平台上同样工作”。

即使使用像 Java 这样非常好的跨平台语言,您也会遇到一些问题,即它在其他平台上的工作方式并不完全相同。

我发现在多个平台上尊重我的时间/生产力/快速迭代能力的唯一方法是使用其他平台的 VM。

还有其他解决方案,例如双启动和我没有提到的解决方案,但我发现它们不尊重我的工作效率/时间。

以双启动为例:

    我在 OS 1 上进行了更改 重启进入 OS 2 忘记 OS 1 上的某些内容 重启进入 OS 1 在 OS 1 上进行更改 重新启动到 OS 2 ... 再次...

BAM我的时间已经过去了 30 分钟,而我没有做任何任何事情有成效。

【讨论】:

3次开机需要30分钟,需要新硬件;并且可能能够从另一个操作系统访问和编辑一个操作系统的文件系统。但我理解这种情绪,也更喜欢虚拟机,因为它们让我大部分时间都可以将它们视为专用的物理机器。 重启所花费的时间不仅仅是启动时间,而是关闭时间、重新启动守护进程、设置开发环境、检查您是否还有最近的结帐版本控制系统等。 更不用说我的大脑失去了所有缓存的一致性,需要慢慢地重新缓存我需要做的所有事情......而且当网络浏览器意外打开时很可能会失去工作效率。 @MartinKällman 这违反了 Apple 许可协议。其合法性取决于您所在的国家/地区。 这可能在技术上违反随机许可协议,但您始终可以购买 Mac Pro 并在其上使用 VM 运行所有三个操作系统。那么,为什么你不能买一个漂亮的 Windows 盒子并做同样的事情呢?允许其他任何事情都是反竞争的做法,在我的书中,这完全是非法的(或者应该是)。【参考方案5】:

你需要一个工具链来交叉编译 mach-o,但即使你有这个,你也不会有 Apple 库来开发。不幸的是,我不确定没有它们你将如何移植。

【讨论】:

如果你有跨工具链,你可以简单地从 OS X 复制库。 复制是可行的方法,但您也需要标头/静态库。【参考方案6】:

Apple 开发本身就是一头奇怪的野兽。 OS X 使用 GCC 的一个端口并进行了一些修改以使其“appley”。理论上,可以获取 Apple GCC 和工具链以及 Apple 内核和库头文件的源代码,并在您的 Windows 机器上构建交叉编译器。

你为什么要走这条路,我无法理解。您可以从 600 美元购买便宜的 Mac mini。你投入的时间让交叉编译器正常工作(尤其是使用用于 Unix 工具的 Windows 主机)无论如何可能花费超过 600 美元。

如果您真的热衷于让您的应用程序跨平台,请查看 Qt、wxWidgets 或 FLTK。所有这些都提供跨平台支持,只需对基本代码进行最少的更改。至少这样你需要做的就是找到一台 Mac 来编译你的应用程序,如果你有一些技术头脑的朋友不介意让你通过 SSH 访问他们的 Mac,这并不难。

【讨论】:

我可以访问许多 Windows 机器。然而,我更喜欢在为 Linux 构建的同时生成 Windows 二进制文件。当然,程序必须在 Windows 上进行测试,但很方便看到程序至少可以一步构建所有目标平台。 更不用说您可能没有 Mac,但有兴趣让其他人(希望在 Mac 上使用您的应用程序)测试应用程序,而无需自己编译。 我认为值得注意的是,Apple 不再在 XCode 中使用 GCC,他们现在使用 Clang/LLVM。【参考方案7】:

您肯定会以某种方式需要 OS X。即使您没有 Mac,您仍然可以尝试一些 alternatives。

【讨论】:

【参考方案8】:

我在网上找到了这个小文档: http://devs.openttd.org/~truebrain/compile-farm/apple-darwin9.txt

这准确地描述了你想要什么。我自己对它很感兴趣,虽然还没有测试过(10分钟前发现的)。不过文档看起来不错。

【讨论】:

【参考方案9】:

您可以从this 网站在云端租用 Mac。你可以从 1 美元起雇佣他们,这应该足够了(除非你需要 root 访问权限,那么你正在寻找 49 美元以上)。

【讨论】:

不过,这假设人们想要将源复制到“云中”的某台机器上。对非 FLOSS 的假设。 不是很长期。用了 30 次以后,买个 mac 会更便宜。【参考方案10】:

有一些交叉编译器设置,但几乎所有这些设置都用于 distcc 风格的分布式编译。据我所知,如果没有真正的 Mac,就无法直接针对 Mac 平台。在不使用 QT 或 wxWidgets 的情况下,您可以获得的最接近的是 OpenStep 与 GNUStep 或类似的,但这不是真正的 Cocoa 平台,只是非常接近。

【讨论】:

即使是 Qt 也需要交叉编译工具链才能在非 OSX 平台上构建 OSX 二进制文件。【参考方案11】:

简短的回答是这样的。您将需要使用像 QT 这样的跨平台库。有像 QT Creator 这样的 IDE,可以让您在一个操作系统上开发并为其他操作系统生成 Makefile。有关跨平台开发的更多信息,请查看this podcast 的跨平台剧集(请注意,该系列尚未结束,而且似乎每周都会推出新剧集)。

正如其他答案所解释的那样,您可能可以在 Windows 或 Linux 上为 Mac 编译,但您将无法测试您的应用程序,因此如果您从事专业编程,或者您可能应该花 600 美元购买 Mac '正在开发开源软件,找一个有 Mac 的开发者来帮助你。

【讨论】:

如何使用 OS Lollipop 在 Java 中为 Android 裁剪图像

】如何使用OSLollipop在Java中为Android裁剪图像【英文标题】:HowtocropimageinjavaforandroidwithOSLollipop【发布时间】:2015-03-1802:09:25【问题描述】:我有以下用于裁剪图像的代码。它在android版本4或OSKitkat中运行良好,但在Android版本5或OSLo... 查看详情

如何使用 FLTK 在 Windows、Mac OS X 和 Linux 中使窗口透明?

】如何使用FLTK在Windows、MacOSX和Linux中使窗口透明?【英文标题】:HowcanImakeawindowtransparentinWindows,MacOSX,andLinuxusingFLTK?【发布时间】:2014-11-0105:10:48【问题描述】:我正在使用FLTK1.3.2用C++编写应用程序。这是我用来在Windows7或8上使... 查看详情

如何在windows中为要在linux中执行的.sh文件分配执行权限

】如何在windows中为要在linux中执行的.sh文件分配执行权限【英文标题】:Howtoassignexecutepermissiontoa.shfileinwindowstobeexecutedinlinux【发布时间】:2012-10-2212:42:44【问题描述】:这是我的问题,在Windows中,我正在制作一个zip文件,其中... 查看详情

如何在 OS X 中为 clang 启用浮点异常?

】如何在OSX中为clang启用浮点异常?【英文标题】:HowdoyouenablefloatingpointexceptionsforclanginOSX?【发布时间】:2016-06-1418:10:09【问题描述】:我希望我的代码在出现浮点错误时终止。在linux-gcc中,“feenableexcept()”函数完成了这项工作... 查看详情

Python:在 Windows 或 Linux 上获取挂载点

】Python:在Windows或Linux上获取挂载点【英文标题】:Python:GetMountPointonWindowsorLinux【发布时间】:2010-11-1110:09:21【问题描述】:我需要一个函数来确定一个目录是否是驱动器的挂载点。我发现这段代码已经适用于linux:defgetmount(path... 查看详情

有关如何在 c# 中为 Windows 7 任务栏编码所需的信息

】有关如何在c#中为Windows7任务栏编码所需的信息【英文标题】:InformationneededonhowtocodeforWindows7Taskbarinc#【发布时间】:2011-04-2017:23:00【问题描述】:到目前为止,我对如何为win7任务栏功能编写代码的了解是,我可以在.net3.5或pinv... 查看详情

如何在 Windows 控制台中为特定像素着色

】如何在Windows控制台中为特定像素着色【英文标题】:Howtocoloraspecificpixelinwindowsconsole【发布时间】:2015-04-2206:38:23【问题描述】:我是C++编程的新手,我觉得学习起来很有趣。任何人都可以给我一个想法,在Windows控制台中为特... 查看详情

使用 Eclipse 在 Windows 中为 Linux 编译 C++ 程序?

】使用Eclipse在Windows中为Linux编译C++程序?【英文标题】:CompilingC++programforLinuxinWindowsusingEclipse?【发布时间】:2010-07-2914:45:16【问题描述】:我想知道是否可以使用Eclipse在Windows中为Linux编写和调试C++应用程序?如果是这样,您能... 查看详情

如何在 powershell 中检测 Linux 或 macOS 或 Windows?

】如何在powershell中检测Linux或macOS或Windows?【英文标题】:HowtodetectLinuxormacOSorWindowsinpowershell?【发布时间】:2021-03-0118:18:31【问题描述】:我在bash脚本中使用uname-s来确定操作系统,它在Linux、macOS或Windows上运行时返回Linux、Darwin... 查看详情

如何在 Visual Studio 2017 中为 Linux 应用启用多线程

...17中的Linux开发多线程应用程序。作为远程Linux机器,我在Windows中使用内置的Ubuntubash,这是周年纪念更新的一部分。编译顺利,构建成功。但是在 查看详情

在 c 中为 Windows 获取终端大小?

】在c中为Windows获取终端大小?【英文标题】:Gettingterminalsizeincforwindows?【发布时间】:2011-10-1208:05:50【问题描述】:如何在Windows下的控制台窗口中使用纯c检查ymax和xmax?linux有这段代码:#include<stdio.h>#include<sys/ioctl.h>in... 查看详情

我可以在 Windows 中为 Linux 平台创建应用程序吗?

】我可以在Windows中为Linux平台创建应用程序吗?【英文标题】:CanicreateapplicationinWindowsforLinuxplatform?【发布时间】:2014-02-1404:17:40【问题描述】:我在C#.Net编程方面有大约4年的经验,我正在开发一个客户端服务器应用程序。服务... 查看详情

如何在windows2008中为iis添加isapi扩展功能

...法如下:1、在"控制面板"中选择"打开或关闭Windows功能"。2、在"服务管理器"中选择"角色",在"Web服务器"中找到"角色服务"列表中的"ISAPI扩展"。3、如果没有找到"ISAPIS扩展&qu... 查看详情

如何在 Java 中为 Mac OS 获取 User ~/Library 路径

】如何在Java中为MacOS获取User~/Library路径【英文标题】:HowtogettheUser~/LibrarypathinJavafortheMacOS【发布时间】:2010-11-0822:02:02【问题描述】:在MacOS上,据我了解,如果每个人都可以阅读文件,您应该将信息存储在“/Library/ApplicationSupp... 查看详情

如何在 Linux 中为强命名程序集创建 .NETCore 的 snk

...为.NETCore2.0创建一堆强命名程序集(库项目)。我知道在Windows上我可以使用sn 查看详情

如何在 XCode 中为不同版本的 iPhone OS 编写代码?

】如何在XCode中为不同版本的iPhoneOS编写代码?【英文标题】:HowdoIcodefordifferentversionsofiPhoneOSinXCode?【发布时间】:2010-08-2720:08:46【问题描述】:我似乎有一个错误,因为我在一个适用于3.0-4.0.2的iPhone项目中使用了-[AVAudioSessionsetA... 查看详情

如何使用 Azure 在 Windows Phone 8 中为特定设备发送推送通知

】如何使用Azure在WindowsPhone8中为特定设备发送推送通知【英文标题】:howtosendpushnotificationforaspecificdeviceinwindowsphone8usingazure【发布时间】:2014-10-2004:06:16【问题描述】:我正在开发WindowsPhone应用程序,为此我需要为特定设备或特... 查看详情

如何像处理语言一样轻松地在 c++ 中为 windows 和 linux 绘制原始像素? [关闭]

】如何像处理语言一样轻松地在c++中为windows和linux绘制原始像素?[关闭]【英文标题】:Howtodrawrawpixelsinc++forwindowsandlinuxeasilylikeintheprocessinglanguage?[closed]【发布时间】:2015-12-2719:49:20【问题描述】:我正在尝试找到使用C++将原始... 查看详情