Проблемы с компиляцией в Objective-c ... помогают? - PullRequest
0 голосов
/ 28 ноября 2010

Пожалуйста, прости меня, так как этот вопрос, я также уверен, был задан, прежде чем я ожидаю.У меня проблема в том, что я пытаюсь изучать obj-c на ПК, потому что у меня еще нет Mac.Я использую Jedit для написания своего кода и GNUstep для компиляции и создания.Однако моя проблема возникает при попытке компилирования с использованием #include

в соответствии с книгой, которую я использую для изучения, а также со всем остальным, что я нашел в Интернете (и не совсем понимаю), мне нужна либо makeфайл или указать мой компилятор в библиотеке или каталоге.Я предпочел бы сделать файл make, как мне кажется, так как кажется, что намного проще и быстрее тестировать вещи и учиться.

тогда главный вопрос заключается в следующем: мне кажется, я нашел файл GNUmake, который прилагается к онлайн-дополнениям к моей книге, но я не знаю, как его использовать или куда его использовать.поэтому, если кто-нибудь может указать мне на простой процесс или узнать о таком процессе и захочет поделиться этой мудростью, это будет очень цениться.

Спасибо за ваше время

1 Ответ

4 голосов
/ 28 ноября 2010

Если вы правильно установили GNUstep и ваша среда настроена (все объяснено в документации), то вам действительно нужно создать пустой GNUmakefile в корневом каталоге вашего проекта и перечислить в нем свои источники.

Вот простой пример командной строки «Hello World»:

Создайте каталог, содержащий ваш исходный код.HelloWorld было бы хорошей идеей.

В этом, создайте файлы main.m, Greeter.m и Greeter.h.

Мы создадим класс Greeter, который будет иметь только одинmethod -sayHelloToRecipient:.

В Greeter.h:

#import <Foundation/Foundation.h>

@interface Greeter : NSObject {
}

-(void)sayHelloToRecipient:(NSString *)recipientName;

@end

И в Greeter.m:

#import "Greeter.h"

@implementation Greeter

-(void)sayHelloToRecipient:(NSString *)recipientName {
    NSLog(@"Hello %@!", recipientName);
}

@end

Ваш файл main.m просто содержитGreeter и вызывает его с аргументом @"World".

#import "Greeter.h"

int main(void) {
    Greeter *greeter = [[Greeter alloc] init];
    [greeter sayHelloToRecipient:@"World"];
    [greeter release];
    return 0;
}

Теперь у вас есть готовые источники для сборки, вам просто нужно создать a GNUmakefile.Создайте пустой файл и начните его со строки: include $(GNUSTEP_MAKEFILES)/common.make, заканчивающейся строкой include $(GNUSTPEP_MAKEFILES)/tool.make.

Первая строка включает все остальные make-файлы и цели, предоставляемые GNUstep.Последняя строка включает make-файлы, необходимые для создания инструмента командной строки.Если бы вы создали приложение с графическим интерфейсом, вы бы включили application.make.Для фреймворков вы бы включили framework.make и т. Д.

include $(GNUSTEP_MAKEFILES)/common.make

# Your project-specific directives will go here

include $(GNUSTEP_MAKEFILES)/tool.make

То, что вы помещаете между этими строками, - это то, что меняется от проекта к проекту.это:

include $(GNUSTEP_MAKEFILES)/common.make

HELLO_ROOT_DIR = $(abspath .)

GNUSTEP_BUILD_DIR = $(HELLO_ROOT_DIR)/build

TOOL_NAME = HelloWorld

HelloWorld_OBJC_FILES = \
    Greeter.m \
    main.m

include $(GNUSTEP_MAKEFILES)/tool.make

HELLO_ROOT_DIR совершенно необязательно и является просто переменной, которая избавляет меня от необходимости повторно вводить путь к корню по мере роста проекта (как и сложность make-файла).

TOOL_NAME требуется для инструмента командной строки и определяет как имя выходного файла, так и определяет, что вам нужно использовать для строки *_OBJC_FILES (т.е. в этом случае мне нужно использовать HelloWorld_OBJC_FILES, потому чтоTOOL_NAME - это "HelloWorld".

Имея это в наличии, при условии, что вы находитесь в том же каталоге, что и make-файл, вы можете просто набрать `make 'для сборки инструмента. Это создасткаталог "build" и внутри которого вы найдете исполняемый файл. Этот при вызове просто выводит:

-$  ./build/obj/HelloWorld 
2010-11-28 03:36:28.459 HelloWorld[12949] Hello World!

Ничего из этого не будет работать, однако, если ваша среда не настроена правильно. Я никогда этого не делална победуДоу, но я предполагаю, что применяются те же принципы.Для настройки среды выполняется сценарий оболочки в Linux / UNIX (запускается пакетный файл в Windows?).

-$  . /usr/share/GNUstep/Makefiles/GNUstep.sh

Проверить правильность настройки можно, напечатав переменную среды GNUSTEP_MAKEFILES вconsole:

-$  echo $GNUSTEP_MAKEFILES

(Не уверен, как вы это делаете в Windows)

Если ничего не выводится, ваша среда настроена неправильно и / или GNUstep установлен неправильно.Если он выводит путь, вы можете безопасно запускать `make '.

...