如何编译在Windows上使用NSApplication的GNUstep应用程序?

时间:2009-09-15 21:08:24

标签: objective-c windows cocoa gcc gnustep

我正在探索在Windows上使用GNUstep编译应用程序。这是我的main.m文件:

#import <???/???.h>

int main(int argc, const char *argv[]) 
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [NSApplication sharedApplication];
    [pool release];
}

我意识到这是一个不完整的片段,至少可以说它显然不会做任何事情。我已经尝试了几个不同的import语句,包括Cocoa / Cocoa.h,GNUstepGUI / GMAppKit.h等。但是我总是遇到编译错误,我似乎无法在网上找到帮助。

这是我的编译命令,我从mingw shell运行:

gcc -o test main.m -I /GNUstep/System/Library/Headers/ \
    -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base \
    -fconstant-string-class=NSConstantString -enable-auto-import

这些是我得到的错误:

c:/WINDOWS/TEMP/ccHxKZG2.o:main.m(.data+0x390): undefined reference to
  '___objc_class_name_NSApplication'
collect2:ld returned 1 exit status

关于#import需要什么,或者我的编译命令需要修复什么的想法?

谢谢!

3 个答案:

答案 0 :(得分:4)

感谢Peter Hosey,我能够将Google自己带到页面上并给出答案:

http://psurobotics.org/wiki/index.php?title=Objective-C

与OS X开发不同,您需要一个“makefile”:

将此文件放入与源名相同的目录中名为“GNUmakefile”的文件中:

include $(GNUSTEP_MAKEFILES)/common.make

APP_NAME = MyAppName
MyAppName_HEADERS =
MyAppName_OBJC_FILES = main.m
MyAppName_RESOURCE_FILES =

include $(GNUSTEP_MAKEFILES)/application.make

然后执行

make

该页面表示执行

openapp ./MyAppName.app
但.app文件夹中的.exe文件似乎独立运行。

答案 1 :(得分:3)

这是一个链接器错误。 #import是预处理程序指令;它不会解决链接中的错误,无论如何,如果你有一个预处理器错误,你就不会有链接。

你需要链接到Foundation和AppKit(特别是后者,对于NSApplication),或任何GNUstep的等价物。

答案 2 :(得分:0)

在Linux下,您可以使用gcc进行编译:

  

public async Task<HttpResponseMessage> PostFormData() { // Check if the request contains multipart/form-data. if (!Request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } string root = HttpContext.Current.Server.MapPath("~/App_Data"); var provider = new MultipartFormDataStreamProvider(root); try { // Read the form data. await Request.Content.ReadAsMultipartAsync(provider); // This illustrates how to get the file names. foreach (MultipartFileData file in provider.FileData) { Trace.WriteLine(file.Headers.ContentDisposition.FileName); Trace.WriteLine("Server file path: " + file.LocalFileName); } return Request.CreateResponse(HttpStatusCode.OK); } catch (System.Exception e) { return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e); } }