Невозможно выполнить программу, скомпилированную с помощью GNUstep
Я использую Windows 10 с GNUstep. Я пытался скомпилировать мой файл AI.m в.exe, чтобы я мог передать его своему другу, но всякий раз, когда я его компилирую, я получаю сообщение об ошибке с самим файлом.exe. Я скомпилировал его как из командной строки Windows, так и из командной строки GNU Shell. В любом случае, я скомпилирую программу, она создаст файл, но когда я попытаюсь запустить его, он запустит ошибки. Это дает мне ошибки:
Не удалось найти точку входа в процедуру _gxx_personality_v0 в библиотеке динамических ссылок C:\GNUstep\bin\libicui18n46.dll
Не удалось найти точку входа в процедуру _gxx_personality_v0 в библиотеке динамических ссылок C:\GNUstep\bin\libicuuc46.dll
Но если я скомпилирую программу через оболочку GNU с помощью файла make, а затем запустите программу через /obj/AI.exe, пока она еще находится в оболочке GNU, она загрузится нормально.
Я также подумал, что, возможно, проблема возникла на моем компьютере, поэтому я положил.exe на флэш-накопитель и перенес его на свой ноутбук. Когда я попытался запустить программу на своем ноутбуке, она выдала ошибку:
Программа не может запуститься, потому что gnustep-base-1_24.dll отсутствует на вашем компьютере. Попробуйте переустановить программу, чтобы решить эту проблему.
Так, что заставляет это работать только после того, как это сделано через файл make, и только через оболочку после файла make? Любой способ исправить эти ошибки, чтобы я мог запустить файл?
Вот код, включенный в файл 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?
0 ответов
Исполняемый файл, скомпилированный с помощью GNUstep, динамически связывается с некоторыми dll. Когда мы запускаем exe в приглашении оболочки GNU, необходимые dll могут быть найдены, и, следовательно, он работает правильно. Но с помощью cmd информации об этих dll нет.
Решение состоит в том, чтобы скопировать все необходимые библиотеки DLL в папку с исполняемым файлом, если вы хотите распространить его на другой компьютер, не устанавливая на него GNUstep.
Я лично обнаружил копирование всех dll, расположенных в <your GUNstep installation folder>\bin
а также <your GUNstep installation folder>\GNUstep\System\Tools
должно сработать. В моем случае это 59 файлов, которые в сумме составляют 59,4 МБ.
И пример списка 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 предоставляет некоторые инструкции по созданию автономных пакетов. Вы можете обратиться кGNUstep Configuration File
а также Standalone packages
главы документации.