Objective C for Windows

在Windows平台上编写Objective-C的最好方法是什么?

Cygwin和gcc? 有没有办法,我可以以某种方式将其整合到Visual Studio?

沿着这些路线 – 有没有关于如何链接和使用Windows SDK的东西这样的build议。 它是一个不同的野兽,但我知道我可以在Windows DLL中编写程序集和链接,使我可以访问这些调用,但我不知道如何做到这一点,没有谷歌search和获取零散的方向。

有没有人知道一个很好的在线或书籍资源做或解释这些事情?

如果你只想要Objective-C而不是任何Cocoa框架,那么gcc就可以在任何平台上工作。 您可以通过Cygwin使用它或获取MinGW。 但是,如果你想要Cocoa框架,或者至less是它们的一个合理的子集,那么GNUStep和Cocotron是你最好的select。

Cocotron实现了很多GNUStep不支持的东西,比如CoreGraphics和CoreData,尽pipe我不能保证它们的实现在特定的框架上有多完整。 他们的目标是让Cocotron与最新版本的OS X保持同步,以便任何可行的OS X程序都可以在Windows上运行。 因为GNUStep通常使用最新版本的gcc,所以它们还支持Objective-C ++和许多Objective-C 2.0特性。

我还没有用GNUSteptesting过这些function,但是如果你使用了一个足够新的gcc版本,你可能会使用它们。 几年前,我无法在GNUStep中使用Objective-C ++。 但是,GNUStep可以从任何平台进行编译。 Cocotron是一个非常以mac为中心的项目。 尽pipe可能在其他平台上编译它,但它是XCode项目文件而不是makefiles,因此您只能在OS X上编译框架。它还附带说明如何编译XCode上的Windows应用程序,但不包括任何其他平台。 基本上,可能为Cocotronbuild立一个Windows开发环境,但是这不像为GNUStep设置一个开发环境那么容易,而且你可以自己做,所以GNUStep绝对是你开发的方法Windows而不仅仅是Windows。

Cocotron是根据MIT许可证获得许可的,而GNUStep则是根据LGPL许可的。

可以在Windows环境中使用Objective C。 如果你按照这些步骤,它应该工作得很好:

  1. 访问GNUstep网站并下载GNUstep MSYS SubsystemGNUstep MSYS Subsystem ), GNUstep Core (GNUstep的库)和GNUstep Devel
  2. 下载这些文件后,请按照该顺序安装,否则将会出现configuration问题
  3. 导航到C:\GNUstep\GNUstep\System\Library\Headers\Foundation 1并确保存在Foundation.h
  4. 打开一个命令提示符并运行gcc -v来检查GNUstep MSYS是否安装正确(如果你没有find文件错误,确保GNUstep MSYSbin文件夹位于PATH
  5. 使用这个简单的“Hello World”程序来testingGNUstep的function:

     #include <Foundation/Foundation.h> int main(void) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSLog(@"Hello World!."); [pool drain]; return; } 
  6. 回到命令提示符,并cd到你保存“Hello World”程序的地方,然后编译它: 2

     gcc -o helloworld.exe <HELLOWORLD>.m -I /GNUstep/GNUstep/System/Library/Headers -L /GNUstep/GNUstep/System/Library/Libraries -std=c99 -lobjc -lgnustep-base -fconstant-string-class=NSConstantString 
  7. 最后,从命令提示符处inputhelloworld来运行它

一切顺利,并与Objective-C玩得开心!


注意事项

  1. 我使用了默认的安装path – 相应地调整您的命令行
  2. 确保你的文件夹path类似于我的,否则你会得到一个错误

也:

Cocotron是一个开放源代码项目,旨在实现与苹果公司Cocoa文档所描述的类似的跨平台Objective-C API。 这包括AppKit,Foundation,Objective-C运行时和支持API,如CoreGraphics和CoreFoundation。

http://www.cocotron.org/

WinObjC? 适用于iOS的Windows Bridge(以前称为“Project Islandwood”)。

适用于iOS的Windows Bridge(也称为WinObjC)是一个Microsoft开源项目,为Visual Studio / Windows提供Objective-C开发环境。 另外,WinObjC提供对iOS API兼容性的支持。 虽然最终版本将在今年秋季晚些时候发布(使桥梁可以利用即将发布的Visual Studio 2015更新附带的新工具function),但是,

现在开放源代码社区现在可以使用该桥。 从现在到秋天。 iOS桥作为MIT许可下的开源项目。 鉴于该项目的雄心,使iOS开发人员可以轻松地在Windows上构build和运行应用程序。

Salmaan Ahmed在iOS上的Windows Bridge上有一篇深入的文章http://blogs.windows.com/buildingapps/2015/08/06/windows-bridge-for-ios-lets-open-this-up/讨论编译器,运行时,IDE集成,桥梁是什么,不是。; 最重要的是,iOS桥的源代码现在就在GitHub上。

iOS桥支持为x86和x64处理器架构而构build的Windows 8.1和Windows 10应用程序,很快我们将添加编译器优化和对ARM的支持,这增加了移动支持。

我对Cocotron项目有着复杂的感受。 我很高兴他们发布源代码和分享,但我不觉得他们正在做的事情最简单的方法。

例子。
苹果公司已经将源代码发布到了objective-c运行时 ,其中包括属性和垃圾收集。 然而,Cocotron项目有自己的Objective-C运行时实现。 为什么要复制这个工作呢? 甚至有一个Visual Studio项目文件可以用来构build一个objc.dll文件。 或者,如果你真的懒,你可以从Windows上的Safari安装中复制DLL文件。

他们也懒得利用CoreFoundation,它也是由苹果开源的。 我发布了一个关于这个问题 ,但没有收到答复。

我认为当前最好的解决scheme是从多个来源(苹果,CocoTron,GnuStep)获取源代码并将其合并到您所需要的。 你将不得不阅读很多来源,但它将是值得的最终结果。

我知道这是一个很老的post,但是我find了一个最近才有的解决scheme,并且几乎允许Windows平台上的所有Objective-C 2.0function。

随着gcc 4.6的出现,在Objective-C编译器中增加了对Objective-C 2.0语言function(块,点语法,综合属性等)的支持(详见发行说明 )。 他们的运行时也被更新,几乎与苹果自己的Objective-C 2.0运行时一致。 简而言之,这意味着(几乎)任何将在Mac上与Clang合法编译的程序都将在不做任何修改的情况下使用gcc 4.6进行编译。

作为一个侧面说明,一个不可用的function是dictionary / array / etc文字,因为它们都被硬编码成Clang来使用Apple的NSDictionary,NSArray,NSNumber等类。

但是,如果你乐于生存,没有苹果的广泛的框架,你可以。 正如在其他答案中指出的,GNUStep和Cocotron提供了苹果类库的修改版本,或者你可以编写自己的(我的首选选项)。

MinGW是在Windows平台上获得GCC 4.6的一种方式,可以从MinGW网站下载。 确保在安装时包含C,C ++,Objective-C和Objective-C ++的安装。 虽然可选,我也build议安装MSYS环境。

一旦安装,Objective-C 2.0源代码可以编译为:

gcc MyFile.m -lobjc -std=c99 -fobjc-exceptions -fconstant-string-class=clsname (etc, additional flags, see documentation)

MinGW还支持使用-mwindows标志编译本地GUI Windows应用程序。 例如:

g++ -mwindows MyFile.cpp

我还没有尝试过,但是我想象一下,如果在Objective-C ++中将Objective-C类包装到最高层,那么应该能够在一个Windows应用程序中成功交织本地Windows GUI C ++和Objective-C。

如果你只是想实验,这里有一个.NET(Windows)的Objective-C编译器: qckapp

WinObjC

https://github.com/Microsoft/WinObjC

这是微软官方开源项目,与Visual Studio + Windows集成。

你可以得到一个客观的C编译器,可以和Windows一起工作,并且可以在这里和Visual Studio 2008 \ 2010一起玩。

open-c flite

只需下载最新的源代码。 你不需要构build所有的CF-Lite,有一个名为objc.sln的解决scheme。 你将需要修复一些包含path,但是这样做会很好。 甚至还包括一个testing项目,所以你可以看到一些正在编译和在Visual Studio中工作的Objective-C .m文件。 一个令人伤心的事情是它只能用于Win32而不是x64。 有一些汇编代码需要为x64编写才能支持。

最近将Objective C 2.0移植到Windows的尝试是主观项目。

从自述文件:

主观性是试图将带有ARC支持的Objective C 2.0带到Windows。

这个项目是objc4-532.2的一个分支,OS X 10.8.5附带的Objective C运行时。 该端口可以在OS X上使用llvm-clang和MinGW链接器进行交叉编译。

有一些限制,其中很多是额外的工作,而另一些例外和块,则依赖于第三方项目中更严肃的工作。 限制是:

•仅32位 – 正在进行64位

•仅静态链接 – dynamic链接正在进行中

•直到libdispatch在Windows上支持它们时才封闭/阻止

•没有例外,直到clang在Windows上支持它们

•没有老式的GC – 直到有人在乎…

•内部:没有vtables,没有gdb支持,只是简单的malloc,没有预优化 – 这些东西中的一些将在64位构build下可用。

•目前需要修补的clang编译器; 该补丁添加了-fobjc-runtime = subj标志

该项目在Github上提供,Cocotron小组也有一个线索 ,概述了所遇到的一些进展和问题。

在这里获取GNUStep

在这里获得MINGW

安装MINGW安装GNUStep然后testing

如果您对Visual Studio环境很熟悉,

小项目:带gcc的jGRASP大项目:Cocotron

我听说有仿真器,但我只能find苹果II模拟器http://virtualapple.org/ 。 它看起来只限于游戏。

首先,忘掉GNUStep工具。 ProjectManager和ProjectCenter都不能称为IDE。 在所有的应有的尊重,看起来像GNUStep项目的人都卡在80年代后期(这是NeXTSTEP第一次出现时)。

VIM

ctags支持自r771以来的Objective-C(一定要selectpre-release 5.9版本,并将--langmap=ObjectiveC:.mh添加到命令行中,请参阅此处 ),因此您将拥有体面的代码完成/标记导航。

下面简单介绍如何为Vim tagbar插件添加Objective-C支持。

Emacs的

现代Emacsen附带的etags也是如此,因此您可以从Emacs Objective C Mode开始 。 YASnippet将提供有用的模板:

YASnippet objc-模式

如果你想要比基本的基于标签的代码完成更智能,请看一下这个问题 。

CDT支持基于Makefile的项目:

在这里输入图像说明

– 从技术上讲,您可以开箱即用地构buildObjective-C项目(在Windows上,您将需要CygwinMinGW工具链)。 唯一的问题是代码编辑器会报告它认为是纯粹的C代码(即时代码检查可以closures,但仍然…)的大量错误。 如果你想要正确的语法高亮,你可以在你的Eclipse中添加Eclim ,并享受EclipseVim的所有优点(见上文)。

另一个有前途的Eclipse插件是Colorer ,但它目前还不支持Objective-C。 尽pipe可以提交function请求。

SlickEdit的

SlickEdit和其他一些优秀IDE的function 一样 支持 Objective-C。 尽pipe学习起来相当复杂(虽然不像Emacs那么复杂),但我相信这是您最好的select,只要您不介意购买(价格相当实惠)。

此外,它还有一个Eclipse插件 ,可以用作独立编辑器的替代品。

KDevelop的

有传闻说有一个KDevelop 补丁 (15岁,但谁在乎?)。 与Emacsen相比,我个人认为Kdevelop没有特性优势,所以我不打算去尝试。


以上内容也适用于Linux上的Objective-C开发,因为所有提到的工具都是可移植的。