Автор Тема: GNUstep, Objective C  (Прочитано 1827 раз)

Оффлайн yushi

  • Давно тут
  • **
  • Сообщений: 72
GNUstep, Objective C
« : 14.11.2010 12:26:42 »
Здравствуйте!

А как настроить окружение для сборки приложений GNUstep?

(Собственно, сам GNUstep не очень интересует, просто хочется, чтобы без правки исходников можно было собирать примеры из заточенных под Mac OS X книжек по Objective C.)

По инструкции отсюда создал файлы main.m и GNUmakefile.

main.m:
#import <Foundation/Foundation.h>

int main(void) {
  NSLog (@"Executing");
  return 0;
}

GNUmakefile:
include $(GNUSTEP_MAKEFILES)/common.make

TOOL_NAME = LogTest
LogTest_OBJC_FILES = source.m

include $(GNUSTEP_MAKEFILES)/tool.make

Первая проблема: чтобы заработал GNUmakefile, пришлось дать команду source /usr/share/GNUstep/Makefiles/GNUstep.sh. Это же, наверное, неправильно, переменные окружения должны настраиваться при установке инструментов разработчика GNUstep?

Вторая проблема: программа собирается, но не запускается. Получаю ошибку:
GNUSTEP Error:
A call to NSProcessInfo +initializeWithArguments:... must be made
as the first ObjC statment in main. This function is used to
establish the argv and environment variables.
: Uncaught exception NSInternalInconsistencyException, reason:
GNUSTEP Error:
A call to NSProcessInfo +initializeWithArguments:... must be made
as the first ObjC statment in main. This function is used to
establish the argv and environment variables.

zsh: abort      obj/LogTest

Гугление подсказало, что в GNUstep есть некий хак под названием fake-main, подставляющий при компиляции вызов NSProcessInfo +initializeWithArguments автоматически. Почему он не работает?

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 253
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: GNUstep, Objective C
« Ответ #1 : 14.11.2010 12:36:58 »
Наверное, надо установить различные devel:
gnustep-base-devel - Header files and static libraries from gnustep-base
gnustep-make-devel - Files needed to develop applications with gnustep-make
gnustep-make-libFoundation-devel - Files needed to develop applications with gnustep-make libFoundation version
gnustep-dirs - Common dirs for GNUstep enviroment


Оффлайн yushi

  • Давно тут
  • **
  • Сообщений: 72
Re: GNUstep, Objective C
« Ответ #2 : 14.11.2010 12:41:27 »
uri@triceratops ~ $ rpm -q gnustep-base-devel
gnustep-base-devel-1.14.1-alt5
uri@triceratops ~ $ rpm -q gnustep-make-devel
gnustep-make-devel-2.0.6-alt4.3
uri@triceratops ~ $ rpm -q gnustep-make-libFoundation-devel
gnustep-make-libFoundation-devel-1.11.0-alt0.1
uri@triceratops ~ $ rpm -q gnustep-dirs
gnustep-dirs-1.0-alt1.0

Если я правильно понял, какими на самом деле должны быть имена пакетов, всё стоит.

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 253
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: GNUstep, Objective C
« Ответ #3 : 14.11.2010 13:03:23 »
Тогда посмотрите в src.rpm - как собираются пакеты, входящие в gnustep

Оффлайн yushi

  • Давно тут
  • **
  • Сообщений: 72
Re: GNUstep, Objective C
« Ответ #4 : 14.11.2010 14:36:29 »
Скачал oolite, посмотрел, как она собирается. Там никакой fake-main не используется, всё прибито гвоздями.

Аналогичным образом исправил свою программу:

#import <Foundation/Foundation.h>

int main(int argc, char* argv[]) {
  extern char** environ;

  #ifdef GS_PASS_ARGUMENTS
  [NSProcessInfo initializeWithArguments: argv count: argc environment: environ];
  #endif

  NSLog (@"Executing");
  return 0;
}

Но это некрасиво довольно, в принципе. Некайфово. =)

Почему так, GNUstep в альте сломан? Или он вообще сломан (не должен бы вроде, проект активно развивается)?

Нельзя ли всё-таки сделать так, чтобы разницы с маком не было вовсе хотя бы на уровне "Hello, world"?

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 253
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: GNUstep, Objective C
« Ответ #5 : 14.11.2010 14:59:18 »
Ну, это надо посмотреть, кто мантейнер пакета. И с ним обсуждать эти вопросы.