无法执行使用 GNUstep 编译的程序

Can't Execute Program compiled with GNUstep

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

The procedure entry point _gxx_personality_v0 could not be located in the dynamic link library C:\GNUstep\bin\libicui18n46.dll

The procedure entry point _gxx_personality_v0 could not be located in the dynamic link library C:\GNUstep\bin\libicuuc46.dll

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

我还认为可能是我的电脑出了问题,所以我将 .exe 文件放到闪存驱动器上,然后将它移到我的笔记本电脑上。当我尝试 运行 笔记本电脑上的程序时,出现错误:

The program can't start because gnustep-base-1_24.dll is missing from your computer. Try reinstalling the program to fix this problem.

那么是什么导致它只能在通过 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 的计算机上将它传送到 运行?

用 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 似乎提供了一些关于制作独立包的说明。可以参考documentation.

GNUstep Configuration FileStandalone packages章节