2009-10-13 5 views
18

Comment faire fonctionner un projet Objective-C sur Ubuntu?Compilation d'un projet Objective-C sous Linux (Ubuntu)

Mes fichiers sont:

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; 
    } 

J'ai essayé deux approches pour le compiler:

  1. gcc pure:

    $ 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. J'ai créé un Makefile GNUmakefile:

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

    ... et couru:

    $ 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' 
    

Donc, dans les deux cas compilateur se bloque à

undefined reference to `__objc_class_name_Fraction' 

Avez-vous et idée de comment résoudre ce problème?

Répondre

9

C'est vrai.Dans les deux cas, vous n'avez pas inclus Fraction.m dans la liste des fichiers à compiler, de sorte qu'il ne peut pas trouver la mise en œuvre de la classe Fraction

Depuis le commentaire, cette commande fonctionne

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

réellement i une erreur de liaison. newacct a raison. Je ne suis pas sûr de l'inclusion de également. Je pense que cela seulement fourni sur MacOS pas dans GNUStep. –

+1

@Johannes Rudolphp: J'ai changé main.m en * .m et ça a marché! – Alex

4

Je ne suis pas un expert à écrire les fichiers faire comme ça, je trouve simplement taper les travaux suivants sur ubuntu bien:

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 

Je l'utilise sur ce projet:

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

Si la commande GCC ci-dessus ne vous fonctionne pas non installé suffisamment de paquets, utilisez apt-cache pour rechercher plus paquets gcc et c objectifs à installer (je viens d'installer plus de paquets qui semblaient pertinents au hasard jusqu'à ce qu'il travaillé)

2

L'approche que je viens de me de travail a été (dans Ubuntu, qui est étroitement liée à Debian):

  • Utilisez Synaptic pour installer tous les packages GNUstep susceptibles prospectifs;
  • Source (.) le script de démarrage GnuStep, /usr/share/GNUstep/Makefiles/GNUstep.sh (cela peut aller dans .profile ou .bashrc ou quelque chose que vous ne devez pas le faire manuellement à chaque fois)
  • Créer une GNUmakefile selon les instructions A First Tool

Ceci m'a permis de construire avec succès des programmes en ligne de commande.

2

Ajouter Fraction.m dans le fichier make,


comprennent $ {} GNUSTEP_MAKEFILES /common.make

tool_name = principaux

main_OBJC_FILES = main.m Fraction.m

inclure $ {GNUSTEP_MAKEFILES} /tool.make


puis faire ^^

2

il suffit d'ajouter à Fraction.m main.m au lieu d'ajouter Fraction.h dans main.m. Et cela fonctionnera. Ce qui suit est le fichier main.m i utilisé:

#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

le fichier makefile:

include ${GNUSTEP_MAKEFILES}/common.make 

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


include ${GNUSTEP_MAKEFILES}/application.make