在 OS X 上从 XCode 迁移到 GCC
Posted
技术标签:
【中文标题】在 OS X 上从 XCode 迁移到 GCC【英文标题】:Moving away from XCode to GCC on OS X 【发布时间】:2012-08-14 15:26:43 【问题描述】:我有一个基于 Snow Leopard、XCode 3.2.6 并针对 10.5 SDK 32/64 位、仅限 INTEL 的代码库。工作正常。我在虚拟机中执行此操作。
现在我已编译 GCC 4.7.1
并在 Mountain Lion 上工作,安装了 XCode 4.4 工具,这样我就可以拥有所有必要的库和依赖项。
我想从 XCode 迁移到 GCC,仍然以 10.5 SDK 为目标,甚至 10.6 SDK 也可以。
我必须创建一个 MakeFile 吗?有没有办法从 XCode 中导出一个?我对从头开始创建 MakeFile 了解不多。
我知道我可以将-mmacosx-version-min=10.5
附加到 gcc 命令,并且我也必须告诉它 64 位。
【问题讨论】:
所以你想要一个命令行构建?看看忍者。 TextMate 2(最近开源)的作者使用它进行命令行构建。 martine.github.com/ninja 在 github 上克隆 TExtMate2 存储库,以查看运行中的完整 ninja-build-system,包括生成 ninja 构建文件的./configure
脚本。
Xcode 是一个 IDE,GCC 是一个编译器,你不能从一个切换到另一个,因为它们做不同的事情。你想达到什么目的?
@Jim 我想从 XCode 迁移到 GCC 和 VIM 来构建我的应用程序。 XCode 速度慢/臃肿,对我来说效果不佳。
你打算用那个 GCC 做什么?还有石器时代的SDK?您可以使用 Xcode 的现代编译器和 SDK,而无需运行 Xcode 本身。
【参考方案1】:
你混淆了多个不同的东西。
如果你想从 Xcode 切换到 vim,你可以……去做。如果您已经安装了 Xcode 命令行工具,那么您的路径上就有 gcc、make 等,它们会正常工作,而且您根本不必考虑 Xcode。事实上,您甚至可以安装命令行工具而不需要 Xcode 的其余部分。
如果您想从 Xcode 工具链切换到不同的工具链,或者使用混合工具链,您可以这样做。你已经安装了 gcc 4.7.1。好的,现在使用gcc_select
,或export CC=/usr/local/bin/gcc-4.7.1
,或者在你的makefile中硬编码路径,或者任何你想要的。这与在任何其他 POSIX 平台上拥有多个工具链没有什么不同。
如果您想在不运行 Xcode 的情况下构建 Xcode 项目,可以在命令行中使用 xcodebuild
。
如果您想将现有项目从 Xcode 转换为 Makefile(或 cmake 或其他),您必须手动完成。通常这并不难,除非项目非常复杂或做了很多 Xcode 特定的事情。您可以从构建输出中看到 Xcode 正在运行的所有实际命令。
如果您想学习如何创建 Makefile,这里有很多很好的教程。但第一个问题是:为什么?学习一些更容易的东西,比如 cmake 是否可以接受,或者这里的全部目标是学习 make?
如果您想进行基于 SDK 的开发,请传递 -arch
,并使用其他 Apple 特定的 gcc 扩展和 gcc 4.7.1……好吧,您不能。这些对 gcc 的扩展尚未移植到任何较新的版本。如果您想自己完成移植它们的工作,我敢肯定有人会喜欢它,但工作量很大。
如果您想使用 gcc 4.7.1 构建其他人的代码,那么开箱即用的可能性也很大。大多数特定于 Mac 的开源项目都依赖于 Apple gcc 扩展,并且大多数跨平台开源项目都有自动工具设置,可以检测到你在 Mac 上并拥有 Xcode 命令行工具并设置自己依赖于那些扩展名。
那么,您对其中哪些有疑问?
还有一件事:
macosx-version-min
设置与 SDK 完全不同,而且是互补的。
例如,要将 SDK 设置为 10.5,您必须将 -isystem $PATH_TO_10_5_SDK/usr/include
和可能附加的 -isystem
标志传递给 /usr
下的其他目录(例如,对于 C++ stdlib),有时还需要将 -L
标志传递给链接器,有时-F
标志编译器和/或链接器。
您还必须拥有 SDK。获得 10.5 SDK 的唯一方法是使用 Xcode 3.2.6 或更早版本——我认为您甚至无法在 Mountain Lion 上安装它。此外,来自 Xcode 3.2.6 的 10.5 SDK 不知道如何在 10.6 之后的构建系统上工作,因此您必须手动破解它(主要是创建一堆符号链接,使其将 10.7 和 10.8 视为相同10.6)。如果你使用的是非 Apple 的 gcc,它也会在试图找到各种东西时感到困惑,比如编译器特定的头文件(尤其是对于 C++),所以你需要更多地破解它。
为什么这么难?因为您几乎从不需要这样做,而 Apple 特别建议您不要这样做。过去 10.4 天,他们曾经建议做事的方式遗留下来了——但仅仅因为它存在并不意味着你应该使用它。
构建在 10.5 上运行的代码的正确方法是 -macosx-version-min=10.5
。您可以并且实际上应该将它与与您的操作系统匹配的 SDK 一起使用(或者甚至可能是更新的 SDK,如果您希望能够使用下一个操作系统版本中的功能)。同样,这个标志可能只支持 clang 和 Apple 扩展的 gcc。但它使 SDK 中的所有内容都以向后兼容的模式神奇地工作。当然,除了在 10.6 或更高版本中添加的新功能 - 如果您尝试在 10.5 机器上进入全屏模式,您只会遇到异常或崩溃。 Apple 有很好的文档说明哪些 API 添加到哪个版本,以及检查每种 API(Cocoa、CoreFoundation 和 POSIX)的正确方法。当然,您需要一台真正的 10.5 机器(或 VM)来进行测试。此外,C++ 标准库(仅限 10.5)和一些库(如 OpenSSL)存在一些错误,Apple 不再建议任何人针对系统副本构建以进行分发。但它仍然比尝试使用 10.5 SDK 构建要容易得多。这是 Apple 明确推荐的。
【讨论】:
CMake 完全没问题。实际上,我最近在为一个项目研究它时已经掌握了少量知识。我想用 C++ 编写 OS X 应用程序,并使用 VIM 和命令行(但也可移植到其他平台)与 XCode。越来越多的 OpenGL 内容和 C++v11 功能。 您仍然混淆了多个问题。您可以在 Xcode 中使用 OpenGL 和 C++11 功能(当然,clang 3.1 具有与 gcc 4.7 不同的 C++11 子集,但它们都有很多内容)。您可以使用 vim 编辑由 Xcode 项目构建的代码(无论您是在 Xcode 中构建还是使用 xcodebuild 构建)。您还可以使用 Xcode 构建基于 make 或 cmake 的项目。所以,再说一遍,你想做什么你不知道该怎么做? 对,我们可以备份一下吗?我想在没有 XCode 的情况下编写 OSX 应用程序。一些 OS X 特定的,主要是通用 OpenGL 的东西。 好的,所以至少我们知道您想编写自己的代码而不是构建其他人的代码。现在,“不使用 Xcode”是指“不运行 GUI”、“不使用其构建系统”、“不使用工具链”还是完全不同的东西?我已经对我能想到的所有可能性给出了简短的迷你答案,但是没有人能够就你可能意味着的每一个可能的事情给你一个完整的答案;你必须告诉我们它是哪一个。【参考方案2】:如果您想避免在 Xcode 中工作,但又想以相同的方式构建东西,您可以使用命令行工具 xcodebuild
,它将以与 Xcode 相同的方式构建 Xcode 项目。
【讨论】:
您仍然需要设置一个蹩脚的 xcode 项目并拥有所有的臃肿,不是吗?我认为 OP 想要一种精简的方式来设置项目并使用 make 目标进行编译。我实际上也想要同样的东西,但我还没有找到任何适用于 ios 的好的文档。 你在这里定义的“膨胀”是什么? 我将膨胀定义为 xcode。一个蹩脚的 IDE,让你像疯子一样到处点击,然后创建一百万个 XML 和/或 json 文件来做你自己可以轻松做的事情,还可以通过 Makefile 了解幕后发生的事情以上是关于在 OS X 上从 XCode 迁移到 GCC的主要内容,如果未能解决你的问题,请参考以下文章
在 Linux (Kubuntu) 上从 MySQL 迁移到 PostgreSQL
在不安装 Xcode 的情况下将 GCC 安装到 Mac OS X Leopard