【问题标题】:How to run Objective-C binary on a web server?如何在 Web 服务器上运行 Objective-C 二进制文件?
【发布时间】:2011-11-10 07:05:29
【问题描述】:

好的,我有一个很奇怪的问题。我觉得用 Objective-C 编写代码比任何其他语言都舒服。我最近不得不做一些服务器端编程,这需要我学习 PHP。它可以工作,是的,但是为了好玩,我想通过 Objective-C 来实现同样的目标。因此,我使用 Xcode 的 Foundation 预设创建了一个二进制文件。这是大部分二进制文件:

#import <Foundation/Foundation.h>
#import "JSONKit.h"

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

    NSString *theURL = [NSString stringWithFormat:@"http://blahblahblah.com/blah"];
    NSError *err = nil;
    NSURLResponse* response = nil;
    NSMutableURLRequest* request = [[[NSMutableURLRequest alloc] init] autorelease];
    NSURL*URL = [NSURL URLWithString:theURL];
    [request setURL:URL];
    [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
    [request setTimeoutInterval:30];
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
    NSDictionary *someData = [data objectFromJSONData];
    NSString *someString = [[someData objectForKey:@"foo"]objectForKey:@"bar"];
    //do something

    [pool drain];
    return 0;
} 

相当基本的代码。它只是从我的服务器下载一些东西,然后我解析 JSON 结果并得到一个我想要使用的字符串。所以,我的问题是——如何在基于 Linux 的服务器上运行它?我知道这是可能的,也许使用我不知道如何使用的 GNUStep(或 cocotron?)。有人有想法吗?

【问题讨论】:

    标签: objective-c gnustep cocotron


    【解决方案1】:

    嗯, 我建议与@lacqui 相同的东西。使用 CGI 运行您的程序。这是步骤。。

    (旁注:不推荐使用CGI,因为它在每次请求到达服务器时都会启动一个进程(现代服务器/Web 容器启动一个新的thread(与process 相比)。)

    那么,让我们开始吧:

    • 输入是用Objectiv-c编写的程序
    • 输出是一个 CGI 脚本(程序或其他名称) 将在一些 http 服务器中运行。

    首先,让我问你,deploy 你的应用程序的目标平台是什么?

    • 如果目标 部署 平台是 Mac,那么您必须从 xcode 中获取二进制文件(我认为它将是 .dmg 格式)并找到一些如何在 Web 服务器中将 .dmg 作为 CGI 程序运行(我不确定 apache 是否在 Mac 下运行)

    • 但如果是WindowsLinux

      1. 您将需要使用 GNUstep 编译您的应用程序(我对从 Xcode 到 GNUstep 的可移植性一无所知)您将需要一个 GNUstep。为WindowsLinux 安装GNUstep 的步骤很简单。
      2. 安装 GNUstep 后,您必须使用它再次编译您的应用程序,请参阅上面相同的两个链接以了解如何编译您的应用程序。
      3. 这里的问题是,AFAIK、GNUstep 不完全支持 Objc-2,因此使用JSONKit.h 导致编译失败的可能性很高。如果你的程序编译成功,那么你就差不多完成了。
      4. 假设您的程序已编译,并且您现在拥有二进制程序。您需要将其部署在启用了CGI 的某些HTTP 服务器中。 You can follow my blogpost here to know how to deploy a binary program written in C into some small http server called mini-httpd on Linux(它应该适用于任何二进制程序,无论其源语言如何)。

    【讨论】:

    • 非常感谢您提供的详细步骤。有机会我会去看看。澄清一下,我在 Mac 上编译此应用程序,然后部署到 Linux 服务器。
    【解决方案2】:

    您要查看的内容称为Common Gateway Interface。它是一种协议,规定了 Web 服务器与下级进程交互的方式。

    将会发生的是,当用户浏览到映射到您的程序的 URL 时,服务器将启动您的程序,并将请求的文本放入 STDIN。您的程序将执行所需的任何处理,然后将结果(以及一些标头信息)放入 STDOUT。

    【讨论】:

    • 这实际上并不意味着为用户做任何事情。它只是一个脚本,将在我的服务器上静默运行,执行某个过程。我只是无法让它在我的服务器上运行。
    【解决方案3】:

    尝试时出了什么问题?你应该可以用GCC's Objective-C compiler 编译它。你应该可以运行它。

    【讨论】:

    • 我收到很多关于架构 x86_64 的未定义符号的错误。我假设你的意思是做这样的事情? gcc main.m -o someexec
    • 当您看到哪些符号未定义时,您可以找到包含它们的相应库。 (可能是 GNUStep。)
    • 我还没有安装 GNUStep。即使我在 Mac 上,我也应该这样做吗?
    • 我以为这个问题是关于基于 Linux 的服务器的。谁制造硬件并不重要。
    • 哦,对不起。我说的是在我的计算机上编译它,然后将生成的二进制文件上传到我的服务器。这不是你建议的吗?我很困惑。
    猜你喜欢
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2011-05-17
    • 2010-12-19
    • 1970-01-01
    • 2017-04-08
    相关资源
    最近更新 更多