Ошибка во время выполнения при компиляции проекта Objective-C с использованием g

#c #objective-c #g #runtime-error

#c #objective-c #g #ошибка во время выполнения

Вопрос:

Я создал действительно небольшой проект с использованием Objective-C, и если я запускаю его с помощью Xcode, он работает действительно хорошо.

Но мне нужно скомпилировать его, используя приведенные ниже командные строки:

 g   Main.mm -o Main `gnustep-config --objc-flags` `gnustep-config --base-libs` -O2 -DONLINE_JUDGE -DBOJ
  

Эта командная строка — это то, что сайт, на который я пытаюсь загрузить свой код для компиляции, использует для компиляции проектов Objective-C.

Но всякий раз, когда я компилирую эту командную строку, я получаю ошибки времени выполнения для использования NSMutableArray , NSSet и NSString .

Ошибки:

 zsh: command not found: gnustep-config
zsh: command not found: gnustep-config
Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_NSMutableArray", referenced from:
      objc-class-ref in Main-49f6e3.o
  "_OBJC_CLASS_$_NSSet", referenced from:
      objc-class-ref in Main-49f6e3.o
  "_OBJC_CLASS_$_NSString", referenced from:
      objc-class-ref in Main-49f6e3.o
  "___CFConstantStringClassReference", referenced from:
      CFString in Main-49f6e3.o
  "_objc_msgSend", referenced from:
      _main in Main-49f6e3.o
  "_objc_opt_new", referenced from:
      _main in Main-49f6e3.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
  

И вот мой исходный код:

 #import <Foundation/Foundation.h>

int main(void) {
    int num = 0;
    int answer = 0;
    scanf("%i", amp;num);
    NSMutableArray *cl = [NSMutableArray new];
    
    for (int k = 0; k < num; k  ) {
        char str[4];
        getchar();
        scanf("%[^n]s", str);
        NSString *userInput = [NSString stringWithUTF8String:str];
        
        if (userInput.length == 1) {
            [cl removeObjectAtIndex:0];
        } else {
            [cl addObject:[userInput substringFromIndex:[userInput length] - 1]];
        }
        
        NSMutableArray *result = [NSMutableArray new];
        for (int i = 1; i <= cl.count; i  ) {
            for (int j = 0; j <= cl.count-i; j  ) {
                [result addObject:[[cl subarrayWithRange:NSMakeRange(j, i)] componentsJoinedByString:@""]];
            }
        }
        
        answer  = [[NSSet setWithArray:result] allObjects].count;
    }
    
    printf("%dn", answer%1000000007);
    
    return 0;
}
  

Ответ №1:

Это ошибки компоновщика, а не ошибки времени выполнения.

Вам необходимо выполнить ссылку на objc библиотеку и Foundation фреймворк. Попробуйте:

 g   Main.mm -lobjc -framework Foundation ...
  

Комментарии:

1. Но сайт, который я использую, не поддерживается мной. Поэтому я не могу так скомпилировать. Должен ли я сообщить сопровождающему сайта, чтобы исправить это? objc #import <Foundation/Foundation.h> int main (void) { NSInteger a,b; scanf("%d %d",amp;a,amp;b); printf("%dn",a b); return 0; } И этот код отлично работает на сайте.

2. Да, я бы поговорил с ними. Код в вашем комментарии не использует основные функции Foundation, вот почему он работает.