2009-10-13 122 views
18

如何使Objective-C項目在Ubuntu上運行?編譯Linux上的Objective-C項目(Ubuntu)

我的文件有:

Fraction.h

#import <Foundation/NSObject.h> 

    @interface Fraction: NSObject { 
     int numerator; 
     int denominator; 
    } 

    -(void) print; 
    -(void) setNumerator: (int) n; 
    -(void) setDenominator: (int) d; 
    -(int) numerator; 
    -(int) denominator; 
    @end 

Fraction.m

#import "Fraction.h" 
    #import <stdio.h> 

    @implementation Fraction 
    -(void) print { 
     printf("%i/%i", numerator, denominator); 
    } 

    -(void) setNumerator: (int) n { 
     numerator = n; 
    } 

    -(void) setDenominator: (int) d { 
     denominator = d; 
    } 

    -(int) denominator { 
     return denominator; 
    } 

    -(int) numerator { 
     return numerator; 
    } 
    @end 

的main.m

#import <stdio.h> 
    #import "Fraction.h" 

    int main(int argc, const char *argv[]) { 
     // create a new instance 
     Fraction *frac = [[Fraction alloc] init]; 

     // set the values 
     [frac setNumerator: 1]; 
     [frac setDenominator: 3]; 

     // print it 
     printf("The fraction is: "); 
     [frac print]; 
     printf("\n"); 

     // free memory 
     [frac release]; 

     return 0; 
    } 

我已經嘗試了兩種方法來進行編譯:

  1. 純GCC:

    $ sudo apt-get install gobjc gnustep gnustep-devel 
    $ gcc `gnustep-config --objc-flags` -o main main.m -lobjc -lgnustep-base 
    /tmp/ccIQKhfH.o:(.data.rel+0x0): undefined reference to `__objc_class_name_Fraction' 
    
  2. 我創建了一個GNUmakefile的Makefile:

    include ${GNUSTEP_MAKEFILES}/common.make 
    
    TOOL_NAME = main 
    main_OBJC_FILES = main.m 
    
    include ${GNUSTEP_MAKEFILES}/tool.make 
    

    ...就跑:

    $ source /usr/share/GNUstep/Makefiles/GNUstep.sh 
    $ make 
    Making all for tool main... 
    Linking tool main ... 
    ./obj/main.o:(.data.rel+0x0): undefined reference to `__objc_class_name_Fraction' 
    

因此,在這兩種情況下的編譯器卡在

undefined reference to `__objc_class_name_Fraction' 

你有和知道如何解決這個問題?

回答

9

是的。在這兩種情況下,你沒有包括在Fraction.m文件列表進行編譯,所以它不能找到類Fraction

實施從評論,此命令的工作

gcc `gnustep-config --objc-flags` -o main *.m -lobjc -lgnustep-base 
+0

實際上它我鏈接錯誤。 newacct是對的。 我也不確定包含。我認爲這隻在MacOS上提供,不在GNUStep中。 – 2009-10-13 07:25:53

+1

@Johannes Rudolphp:我將main.m更改爲* .m,它工作正常! – Alex 2009-10-13 10:08:41

4

我不是專家在編寫make文件那樣的,我覺得只要輸入在Ubuntu下工作得很好:

gcc -I /usr/include/GNUstep/ -I /usr/include/mysql -L /usr/lib/GNUstep/\ 
    -lgnustep-base -lmysqlclient\ 
    -g -ggdb\ 
    -fconstant-string-class=NSConstantString -o test *.m 

我使用它在這個項目上:

http://github.com/uptecs/SmsgateDelivery/

如果您還沒有安裝足夠的包上面GCC命令不起作用,使用apt-cache以尋找更多的gcc和目標C要安裝的軟件包(我剛安裝更多的包,看起來相關的隨機,直到它工作)

2

我剛剛工作是該方法(在Ubuntu,這是密切相關的Debian):

  • 使用Synaptic來安裝所有可能的前瞻性GNUstep的包;
  • 源(.)GNUstep的啓動腳本,/usr/share/GNUstep/Makefiles/GNUstep.sh(這個可以進入.profile.bashrc什麼的,這樣你就不必每次做手工)
  • 根據指令A First Tool
  • 創建 GNUmakefile

這讓我成功地構建命令行程序。

2

添加Fraction.m make文件,


包括$ {} GNUSTEP_MAKEFILES /common.make

TOOL_NAME =主

main_OBJC_FILES =的main.m Fraction.m

include $ {GNUSTEP_MAKEFILES} /tool.make


,然後作出^^

2

在main.m文件只需添加Fraction.m,而不是添加Fraction.h在main.m.這將工作。以下是main.m文件我用:

#import <stdio.h> 
#import "Fraction.m" 

int main(int argc, const char *argv[]) { 
    //create a new instance 
    Fraction *frac = [[Fraction alloc] init]; 

    //set the values 
    [frac setNumerator: 1]; 
    [frac setDenominator: 3]; 

    //print it 
    printf("The fraction is : "); 
    [frac print]; 
    printf("\n"); 

    //free memory 
    [frac release]; 

    return 0; 
} 
3

make文件:

include ${GNUSTEP_MAKEFILES}/common.make 

APP_NAME=Fraction 
Fraction_HEADERS = Fraction.h 
Fraction_OBJC_FILES = main.m Fraction.m 


include ${GNUSTEP_MAKEFILES}/application.make