2012-07-11 95 views
8

似乎有很多關於如何做到這一點的教程,每個教程都略有不同。我希望有人能夠認出我收到的錯誤信息,並指引我朝着正確的方向前進。Linux上的Objective-C編譯錯誤

我的代碼,HM是:

. /usr/share/GNUstep/Makefiles/GNUstep.sh 

我嘗試編譯:

gcc `gnustep-config --objc-flags` -lgnustep-base h.m -o hello 

,並得到

#import <Foundation/Foundation.h> 
int main (int argc, const char * argv[]) 
{ 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
NSLog (@"hello world"); 
[pool drain]; 
return 0; 
} 

我編譯之前,我在控制檯輸入:

 
/tmp/ccgLOnpY.o: In function `main': 
/home/ge/objective-c/h.m:4: undefined reference to `objc_get_class' 
/home/ge/objective-c/h.m:4: undefined reference to `objc_msg_lookup' 
/home/ge/objective-c/h.m:4: undefined reference to `objc_msg_lookup' 
/home/ge/objective-c/h.m:5: undefined reference to `NSLog' 
/home/ge/objective-c/h.m:6: undefined reference to `objc_msg_lookup' 
/tmp/ccgLOnpY.o: In function `__objc_gnu_init': 
/home/ge/objective-c/h.m:8: undefined reference to `__objc_exec_class' 
/tmp/ccgLOnpY.o:(.data.rel+0x0): undefined reference to `__objc_class_name_NSConstantString' 
/tmp/ccgLOnpY.o:(.data.rel+0x8): undefined reference to `__objc_class_name_NSAutoreleasePool' 
collect2: ld returned 1 exit status 

有人可以指出我正確的方向嗎?

TIA

+1

你爲什麼不建立與使用GNUmakefile GNUstep的,化妝?這是如何寫一個http://www.gnustep.it/nicola/Tutorials/WritingMakefiles/index.html – 2013-03-07 08:58:26

回答

29

的原因鏈接錯誤是最有可能是由於連接器鏈接庫的行爲,只有庫鏈接之前看到在編譯的符號之後。由於h.m出現在-lgnustep-base之後,庫未鏈接,因爲庫中的符號尚未遇到。您可以指示鏈接鏈接庫,即使使用-Wl,--no-as-needed連接選項都沒有遇到過的符號

gcc `gnustep-config --objc-flags` -Wl,--no-as-needed -lgnustep-base h.m -o hello 

或者更好的是剛剛轉會源到編輯命令的開始,因爲

gcc h.m `gnustep-config --objc-flags` -lgnustep-base -o hello 

觀察到的鏈接器行爲是爲了阻止查找鏈接庫的符號,這些鏈接符號可能並不是必需的,但無論如何都是在編譯中鏈接的,因此第二種選擇將是推薦的方式,而不是添加鏈接器選項-Wl, --no-as-needed
希望這有助於!

+0

謝謝AnotherAnon,最後的命令行指出它。謝謝! – Geremy 2012-07-11 05:27:56

+0

是的,這真的很有幫助,非常感謝 – Leo 2013-12-20 08:00:12

9

您需要鏈接到libobjc。修復非常簡單;只是編譯:

gcc h.m `gnustep-config --objc-flags` -lobjc -lgnustep-base -o hello 
+0

謝謝安迪。使用你的命令行,我仍然會得到同樣的錯誤。 – Geremy 2012-07-11 04:45:39

2

這個方法似乎不錯:

gcc h.m `gnustep-config --objc-flags` -lgnustep-base -o hello 
5

您還需要指定鏈接標誌:

gcc h.m `gnustep-config --objc-flags` `gnustep-config --objc-libs` \ 
-lobjc -lgnustep-base -o hello