适用于Windows的Objective-C


230

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

Cygwin和gcc?有什么方法可以将其集成到Visual Studio中吗?

沿着这些思路,关于如何链接和使用Windows SDK之类的东西,有任何建议。它是另一种野兽,但是我知道我可以在Windows DLL中编写汇编和链接,使我可以访问这些调用,但是我不知道如何在不进行谷歌搜索和获得零碎指导的情况下进行操作。

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


5
如果您只是在iOS上使用,则可以使用PM Baty的iOS Build Environment ...
Cole Johnson

Answers:


146

扩展前面的两个答案,如果您只想使用Objective-C而不是任何Cocoa框架,那么gcc可以在任何平台上工作。您可以通过Cygwin使用它或获取MinGW。但是,如果您需要Cocoa框架或至少它们的合理子集,那么GNUStep和Cocotron是您的最佳选择。

Cocotron实现了许多GNUStep不能实现的功能,例如CoreGraphics和CoreData,尽管我不能保证它们在特定框架上的实现有多完整。他们的目的是使Cocotron保持最新版本的OS X,以便任何可行的OS X程序都可以在Windows上运行。由于GNUStep通常使用最新版本的gcc,因此它们还增加了对Objective-C ++和许多Objective-C 2.0功能的支持。

我尚未使用GNUStep测试这些功能,但是如果您使用的是足够新版本的gcc,则可以使用它们。几年前,我无法在GNUStep上使用Objective-C ++。但是,GNUStep几乎可以从任何平台进行编译。Cocotron是一个非常以Mac为中心的项目。尽管可能在其他平台上进行编译,但它是XCode项目文件,而不是makefile,因此,您只能在OS X上即开即用地编译其框架。它还附带有关在XCode上编译Windows应用程序的说明,但没有提供任何其他平台。基本上,可以为Cocotron设置一个Windows开发环境,但是它不像为GNUStep设置一个那样简单,而且您将自己一个人,所以如果您要在GNUStep上进行开发,那么GNUStep绝对是必经之路Windows,而不只是Windows。

就其价值而言,Cocotron已获得MIT许可,而GNUStep已获得LGPL许可。


1
您始终可以移植开源的可可框架。示例是CoreFoundation。
科尔·约翰逊

并非所有的Core Foundation都是开源的。大量的封闭源。
uchuugaka

X'D我不知道为什么这个家伙得到了一个最好的答案,他甚至没有尝试他正在谈论的东西。他们应该为bs答案制作新的徽章。没有冒犯@michael。这是一个有趣的读物。
Wolfpack'08 2015年

没有冒犯,但据记录,在我编写此答案时,我一直在努力编译Windows的Objective-C,并尝试同时使用GNUStep和Cocoatron。由于当时的一些编译器错误,以及Windows上未将ivars初始化为0,我最终被迫用C ++重写了该项目。我确实提到了“我还没有测试那些功能”,但是我当时谈论的是当时新的Objective-C 2.0功能,在撰写此答案时,该功能仅在Apple平台上可用不到一年,并且刚登陆GNUStep。
Michael Buckley

89

可以在Windows环境中使用ObjectiveC。如果您按照这些步骤,它应该可以正常工作:

  1. 访问GNUstep网站并下载GNUstep MSYS Subsystem(对于GNUstep为MSYS),GNUstep Core(对于GNUstep为库),以及GNUstep Devel
  2. 下载这些文件后,按该顺序安装,否则您将在配置方面遇到问题
  3. 导航到C:\GNUstep\GNUstep\System\Library\Headers\Foundation1并确保Foundation.h存在
  4. 打开命令提示符并运行gcc -v以检查是否GNUstep MSYS已正确安装(如果出现找不到文件的错误,请确保中的bin文件夹GNUstep MSYS位于PATH
  5. 使用以下简单的“ Hello World”程序来测试GNUstep的功能:

    #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. 最后,在命令提示符下,键入helloworld以运行它

祝一切顺利,并与Objective-C一起玩乐!


注意事项

  1. 我使用了默认的安装路径-相应地调整命令行
  2. 确保您的文件夹路径与我的文件夹路径相似,否则会出现错误

1
建议的安装在我的PC上不起作用,因为我已经安装了用于nasm的gcc。所以我只是改正gcc -o helloworld...c:\gnustep\bin\gcc -o helloworld...,它奏效了。另一种选择是修改环境变量,因为我只是看到目标C,所以我没有这样做。感谢teshguru给出了正确的答案。
Martin Berger 2012年

考虑删除事物名称周围的代码格式。GNUstep MYSY不是代码,只是软件的名称。如果您想让某些产品脱颖而出,也许可以考虑壮大它?而且,如果有东西连接到标签,请考虑使用标签定界符,但是应该没有任何理由在标签delim中放入适当的名称。
Wolfpack'08 2015年

使用时yhis c:\ gnustep \ bin \ 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它可以正常工作
Dalvik

13

也:

Cocotron是一个开源项目,旨在实现类似于Apple Inc. Cocoa文档中描述的跨平台的Objective-C API。这包括AppKit,Foundation,Objective-C运行时和支持API,例如CoreGraphics和CoreFoundation。

http://www.cocotron.org/


4
Cocotron项目旨在从XCode交叉编译,而不是在Windows上编写而不在Windows上编译。
丹·乌迪

2
这不是一个好答案,我什至不知道为什么OP会选择这个作为“答案”,因为CoCotron适用于Mac,而OP则需要基于Windows的解决方案。
cbrulak

您是正确的-当我读到这篇文章时,我有些激动:“总体目标是在任何可行的平台上提供完整的支持,该项目旨在尽可能地可移植。但是,目前的大部分工作是致力于提供对Microsoft Windows的支持。特别是基于NT的版本,从2000到Vista。”
路德·贝克

13

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

Windows Bridge for iOS(也称为WinObjC)是Microsoft开源项目,为Visual Studio / Windows提供了Objective-C开发环境。此外,WinObjC还提供了对iOS API兼容性的支持。虽然最终版本将在今年秋天晚些时候发布(允许桥梁利用即将推出的Visual Studio 2015 Update附带的新工具功能),

目前,开放源社区可以使用此桥。从现在到秋天。iOS桥是MIT许可下的开源项目。鉴于该项目的雄心壮志,iOS开发人员可以轻松在Windows上构建和运行应用程序。

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处理器体系结构构建的Windows 8.1和Windows 10应用程序,不久我们将添加编译器优化和对ARM的支持,从而增加了移动支持。


9

我对Cocotron项目有百感交集。我很高兴他们发布了源代码并进行了共享,但是我不认为他们正在以最简单的方式进行操作。

例子。
Apple已将源代码发布到Objective-C运行时,其中包括属性和垃圾回收。但是,Cocotron项目有自己的Objective-C运行时实现。为什么要麻烦重复努力呢?甚至还有一个Visual Studio Project文件,可用于生成objc.dll文件。或者,如果您真的很懒,则可以从Windows上安装的Safari复制DLL文件。

他们还没有去利用CoreFoundation,后者也是由Apple开源的。我对此发表了一个问题,但没有得到答案。

我认为当前最好的解决方案是从多个来源(Apple,CocoTron,GnuStep)获取源代码并将其合并到您需要的内容中。您将不得不阅读大量的资料,但这将是值得的最终结果。


2
很抱歉没有回答您的问题,总结一下:APSL很糟糕,运行时和CF都在下面。
Christopher Lloyd

1
APSL有什么不好的地方?(opensource.apple.com/license/apsl)它不像GPL那样具有侵入性。如果您修改涵盖的代码,则必须使该代码可用。例如,涵盖的代码将是您对CoreFoundation所做的任何修改,但不包括您的实际程序。您还需要清楚地标记您的修改。这很麻烦,但是值得使用苹果经过高度测试的代码,这不是吗?
Matthieu Cormier,2009年

8
我不认为您了解终止的工作原理,这不是他们可以一次对所有人进行的操作,该代码已获得该条款的许可,并且可以无限期地使用。可能发生的事情是Apple可以挑出他们认为已违反许可的个人/公司。FSF已经通过违反GPL来做到这一点,您真的认为Apple对开发人员比FSF更友好吗?如果您认为这些术语无关紧要且毫无意义,我相信您可以说服Apple Legal将其删除。
Christopher Lloyd

8
应当注意,Apple与FSF合作进行了APSL的更改,并且FSF认为APSL 2.0版是免费软件许可。gnu.org/philosophy/apsl.html
肖恩

3
从我的角度来看(作为与BSD,LGPL,MIT和其他专有产品许可证打交道的人),Apple的许可证比GPL的限制要少-坦白地说,这很痛苦。如果我可以获得BSD,MIT或APSL,则我更愿意与GPL合作。
劳埃德·萨金特

8

我知道这是一篇很老的文章,但是我发现一种解决方案直到最近才可用,并且在Windows平台上启用了几乎所有的Objective-C 2.0功能。

随着gcc 4.6的问世,对Objective-C 2.0语言功能(块,点语法,合成属性等)的支持已添加到Objective-C编译器中(有关详细信息,请参见发行说明)。它们的运行时也已更新,几乎可以与Apple自己的Objective-C 2.0运行时相同。简而言之,这意味着(几乎)任何将在Mac上使用Clang合法编译的程序也将使用gcc 4.6进行编译,而无需进行任何修改。

附带说明一下,字典/数组/等文字无法使用,这是一个不可用的功能,因为它们都被硬编码到Clang中以使用Apple的NSDictionary,NSArray,NSNumber等类。

但是,如果您很高兴没有Apple广泛的框架,可以这样做。如其他答案所述,GNUStep和Cocotron提供了Apple类库的修改版本,或者您可以编写自己的类库(我的首选)。

MinGW是在Windows平台上获得GCC 4.6的一种方法,可以从MinGW网站下载。确保安装时包括C,C ++,Objective-C和Objective-C ++的安装。虽然是可选的,但我也建议安装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交织在一起。



6

如果您只是想尝试,这里有一个用于.NET(Windows)的Objective-C编译器:qckapp


#import <Foundation / Foundation.h> int main(int argc,const char * argv []){NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSLog(@“测试中... \ n..1 \ n ... 2 \ n .... 3”); [池排水];返回0; }
KIRAN KJ

5

您可以在此处获得可与Windows一起使用并与Visual Studio 2008 \ 2010完美配合的目标c编译器。

开放C轻

只需下载最新资源。您不需要构建所有CF-Lite,而有一个名为objc.sln的解决方案。您将需要修复一些包含路径,但随后它将构建良好。甚至包括一个测试项目,因此您可以看到正在Visual Studio中编译并工作的一些Objective-c .m文件。一件可悲的事情是,它仅适用于Win32,而不适用于x64。为了支持x64,需要为x64编写一些汇编代码。


我使用Visual Studio 2013下载并运行了该项目,并且出现了30个此错误的实例。错误64错误C2632:'char'后跟'bool'是非法的C:\ opencflite-code-248-trunk \ include \ c99 \ stdbool.h 20 1 objc
Adam Mendoza

4

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

从自述文件:

主观的尝试是将带有ARC支持的Objective C 2.0引入Windows。

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

存在某些局限性,其中许多局限性在于额外的工作,而其他一些局限性,例如例外和阻止,则取决于第三方项目中更认真的工作。限制是:

•仅32位-正在进行64位

•仅静态链接-动态链接正在进行中

•没有闭包/块-直到libdispatch在Windows上支持它们

•无例外-直到clang在Windows上支持它们为止

•没有旧式GC-除非有人在乎...

•内部:没有vtables,没有gdb支持,只是纯malloc,没有预优化-其中一些功能将在64位版本下可用。

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

该项目在Github上可用,Cocotron Group上也有一个线程,概述了一些进度和遇到的问题。



0

如果您对Visual Studio环境感到满意,

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

我听说有模拟器,但是我只能找到Apple II模拟器http://virtualapple.org/。看起来仅限于游戏。


0

首先,忘记GNUStep工具。无论ProjectManager也不ProjectCenter中可以被称为一个IDE。出于所有应有的尊重,看起来GNUStep项目的家伙陷入了80年代后期(那时NeXTSTEP首次出现时)。

Vim

ctagsr771开始支持Objective-C (请务必选择5.9之前的版本并添加--langmap=ObjectiveC:.m.h到命令行,请参见此处),这样您将获得不错的代码完成/标签导航。

这里是一个简短的HOWTO上的Vim tagbar插件添加Objective-C的支持。

埃马克斯

这同样适用于etags现代Emacsen附带的产品,因此您可以从Emacs Objective C Mode开始YASnippet将提供有用的模板:

YASnippet objc模式

如果您想获得比基于标记基本代码完成更智能的功能,请看一下这个问题

CDT支持Makefile基于项目的项目:

在此处输入图片说明

-因此从技术上讲,您可以开箱即用地构建Objective-C项目(在Windows上,您将需要CygwinMinGW工具链)。唯一的问题是代码编辑器,它将针对纯C代码报告大量错误(可以关闭即时代码检查,但仍然...)。如果要正确突出显示语法,可以将Eclim添加到Eclipse中,并享受EclipseVim的所有出色功能(请参见上文)。

另一个有前途的Eclipse插件是Colorer,但是它到目前为止还不支持Objective-C。不过请随时提出功能请求。

SlickEdit

SlickEdit的,除其他功能有很大的IDE, 支持 Objective-C的。虽然学习起来相当复杂(尽管不像Emacs那样复杂),但我相信这是您最好的选择,只要您不介意购买它(价格相当合理)。

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

开发

有传言说它存在一个KDevelop 补丁(15岁,但是谁在乎?)。我个人认为KDevelopEmacsen相比没有功能上的优势,因此我不会去尝试。


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.