2013-02-17 2 views
5

Итак, я получил Ubuntu и установил clang3.0 и простой program.m:лязг компиляции ошибка (неопределенная ссылка на objc_autoreleasepoolpush)

#include <Foundation/Foundation.h> 
int main() 
{ 
     @autoreleasepool{ 
      NSLog(@"Hi"); 
     } 

     return 0; 
} 

и я пытаюсь скомпилировать это так:

clang first.m -I /usr/include/GNUstep/ -lgnustep-base -fconstant-string-class=NSConstantString -objc 

и я получаю

undefined reference to objc_autoreleasePoolPush 
undefined reference to objc_autoreleasePoolPop 

поэтому я гугл немного и установить objc2 и попробовал:

clang first.m -I /usr/include/GNUstep/ -lgnustep-base -fconstant-string-class=NSConstantString -objc2 

но ничего не меняется. Может быть, кто-то решил такую ​​же проблему?

ответ

0

С libobjc2 установленного в системе Ubuntu, копия ваших файлов first.m компилирует для меня с этой линией:

clang first.m `gnustep-config --objc-flags` `gnustep-config --objc-libs` \ 
-I /usr/include/GNUstep/ -lgnustep-base 

но, возможно, это просто опечатка в конце вашей командной строки?

-objc в конце вашего первого примера и -objc2 в конце второго инструктирует компилятор clang создавать исполняемые файлы с именами bjc и bjc2 соответственно. Вы имели в виду -lobj? Я думаю, что связывание в библиотеке obj имеет решающее значение для получения библиотеки времени выполнения Objective-C. Даже с проектом libobjc2, созданная библиотека по-прежнему называется libobjc.so.x.y. Если ваша команда не содержит -lobjc, я не вижу, как она могла бы правильно ссылаться. Я мог ошибаться, но без меня это не работает.

+0

спасибо WeakPointer) clang first.m 'gnustep-config --objc-flags'' gnustep-config --objc-libs' -I/usr/include/GNUstep/-lgnustep-base -I/home/nazar/libobjc2/ это работает отлично, но я получаю предупреждение: аргумент неиспользованного во время компиляции: '-shared-libgcc' еще раз спасибо) – Nils

+0

и теперь я получаю предупреждение: libobjc.so.3, необходимую/USR/Библиотека/libgnustep -base.so, может конфликтовать с libobjc.so.4 – Nils

0

Я не уверен, что это относится к GNUstep, но в OS X вам нужно добавить флаг компилятора -fobjc-arc, если вы хотите скомпилировать его с помощью ARC.

+0

ошибка: -fobjc-arc не поддерживается с хрупким abi – Nils

+1

Согласно http://wiki.gnustep.org/index.php/ObjC2_FAQ, вы должны добавить опцию '-fobjc-nonfragile-abi'. –

+0

Я попробую http://wiki.gnustep.org/index.php/GNUstep_under_Ubuntu_Linux – Nils

0

Попробуйте построить его с помощью GNUmakefile?

Вот как это написать.

http://www.gnustep.it/nicola/Tutorials/WritingMakefiles/node2.html

Можно было бы быть скомпилированы и связаны, как

лязг first.m -c -MMD -MP -DGNUSTEP -DGNUSTEP_BASE_LIBRARY = 1 -DGNU_GUI_LIBRARY = 1 -DGNU_RUNTIME = 1 -DGNUSTEP_BASE_LIBRARY = 1 -fobjc -runtime = gnustep-1.7 -fno-strict-aliasing -fexceptions -fobjc-exceptions -D_NATIVE_OBJC_EXCEPTIONS -fobjc-nonfragile-abi -D_NONFRAGILE_ABI -pthread -fPIC -DDEBUG -fno-omit-frame-pointer -Wall -DGSWARN -DGSDIAGNOSE -Wno -import -g -fgnu-runtime -fconstant-string-class = NSConstantString -I. -I/usr/local/include -o obj/first.obj/first.mo

clang -rdynamic -pthread -shared-libgcc -fexceptions -fobjc-nonfragile-abi -fgnu-runtime -o obj/first. /obj/first.obj/first.mo -L/usr/local/lib -lgnustep-base -lobjc -lm

В зависимости от того, как вы настроите пакет GNUstep make.

+0

А? Что делает makefile связанным с проблемой компоновщика OP? – trojanfoe

+0

Это не просто make-файл, это make-файл, содержащий настроенные параметры.GNUstep make package обычно предоставляет параметры, которые были использованы для создания библиотек GNUstep, включая опции linker. –

Смежные вопросы