无法执行使用GNUstep

时间:2017-11-09 04:10:36

标签: objective-c windows gnustep

我使用GNUstep运行Windows 10。我一直在尝试将我的AI.m文件编译成.exe,所以我可以把它交给我的朋友,但每当我编译它时,我都会收到.exe文件本身的错误。我已经通过Windows命令提示符以及GNU Shell提示符编译了它。无论哪种方式我编译程序,它将成功制作文件,但当我尝试运行它时,它将启动错误。它给我的错误是:

  

程序入口点_gxx_personality_v0无法位于动态链接库C:\ GNUstep \ bin \ libicui18n46.dll

     

程序入口点_gxx_personality_v0无法位于动态链接库C:\ GNUstep \ bin \ libicuuc46.dll

但是如果我通过带有make文件的GNU shell编译程序,然后在仍然在GNU shell中的/obj/AI.exe下运行该程序,它将正常加载。

我也想过也许是我的电脑出了问题,所以我将.exe放到闪存盘上并将它移到我的笔记本电脑上。当我试图在我的笔记本电脑上运行该程序时,它给出了错误:

  

程序无法启动,因为您的计算机缺少gnustep-base-1_24.dll。尝试重新安装该程序以解决此问题。

那么是什么导致它仅在通过make文件完成后才能工作,并且只能通过make文件后面的shell来工作?有没有办法解决这些错误,以便我可以运行该文件?

以下是AI.m文件中包含的代码:

#include "stdio.h"
#include "stdlib.h"
#include "Foundation/Foundation.h"

int main(void) {

    NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];

    char * rawinput = malloc(sizeof(char));

    system("cls");
    fflush(stdout);

    printf("Hello, my name is (Not Yet Available), and I am an in progress AI.");
    //printf("\nCurrently, I have no features, but will be working soon.");
    //printf("\nI can't wait until I am better able to assist you.");
    fflush(stdout);

    printf("\nCurrently I can only get the date and time for you of your current location.");
    printf("\nWould like me to get one of them for you?");
    printf("\n");
    fflush(stdout);

    scanf( "%s" , rawinput );

    NSString *input = [NSString stringWithCString:rawinput encoding:1];

    if ([input caseInsensitiveCompare:@"yes"]==NSOrderedSame) {
        printf("Great! Let me pull it for you right now.");
        fflush(stdout);
        //TODO: Pull the weather
    } else if([input caseInsensitiveCompare:@"no"]==NSOrderedSame) {
        printf("I understand.  I hope I was of service to you.");
        fflush(stdout);
    } else {
        printf("Sorry, I can only understand if you say 'yes' or 'no' right now.");
        printf("\nIf you want to try again, please restart the program.");
        fflush(stdout);
    }

    [myPool drain];
    return EXIT_SUCCESS;
}

编辑:所以我进入了我的计算机的环境变量,并将有关GNUstep的变量移到了列表的顶部,在其他所有之前,现在程序将打开正常。所以有一些问题导致了从哪里使用.dll的问题。但是,如何让它在另一台没有安装GNUstep的计算机上运行呢?

1 个答案:

答案 0 :(得分:0)

使用GNUstep编译的可执行文件与某些dll动态链接。当我们在GNU Shell提示符下运行exe时,可以找到所需的dll,因此它可以正常运行。但是使用cmd时,没有有关这些dll的信息。

解决方案是,如果要将其分发到另一台计算机而不在该计算机上安装GNUstep,则将所有必需的dll复制到该exe的位置。

我个人发现复制位于<your GUNstep installation folder>\bin<your GUNstep installation folder>\GNUstep\System\Tools中的所有dll都可以。就我而言,这是59个文件,总计59.4 MB。

还有a post that helped me a lot中的示例dll列表:

-rw-rw-rw-  1 simon  staff  10101741 24 Jan 17:04 gnustep-base-1_24.dll 
-rw-rw-rw-  1 simon  staff    118546 24 Jan 17:08 libffi-5.dll 
-rw-rw-rw-  1 simon  staff    118784 24 Jan 17:01 libgcc_s_dw2-1.dll 
-rw-rw-rw-  1 simon  staff   2060376 24 Jan 17:09 libgcrypt-11.dll 
-rw-rw-rw-  1 simon  staff   3438376 24 Jan 17:09 libgnutls-26.dll 
-rw-rw-rw-  1 simon  staff    215716 24 Jan 17:11 libgpg-error-0.dll 
-rw-rw-rw-  1 simon  staff   1038350 24 Jan 17:09 libiconv-2.dll 
-rw-rw-rw-  1 simon  staff  15189954 24 Jan 17:12 libicudata46.dll 
-rw-rw-rw-  1 simon  staff   2518394 24 Jan 17:10 libicui18n46.dll 
-rw-rw-rw-  1 simon  staff   1590522 24 Jan 17:10 libicuuc46.dll 
-rw-rw-rw-  1 simon  staff    101390 24 Jan 17:11 libintl-8.dll 
-rw-rw-rw-  1 simon  staff    329671 24 Jan 17:11 libp11-kit-0.dll 
-rw-rw-rw-  1 simon  staff    978958 24 Jan 17:11 libstdc++-6.dll 
-rw-rw-rw-  1 simon  staff   3959238 24 Jan 17:10 libxml2-2.dll 
-rw-rw-rw-  1 simon  staff    100366 24 Jan 17:10 libz-1.dll 
-rw-rw-rw-  1 simon  staff    659799 24 Jan 17:07 objc-4.dll 
-rw-rw-rw-  1 simon  staff     94300 24 Jan 17:10 pthreadGC2.dll 

此外,GNUstep似乎提供了一些有关制作独立软件包的说明。您可以参考documentationGNUstep Configuration FileStandalone packages章节。