2010-11-03 6 views
1

J'apprends Objective-C sur Windows en utilisant GNUstep. J'ai une classe principale qui ressemble à ceci:Linker ne trouve pas les fichiers de classe dans le code Objective-C

#import <Foundation/Foundation.h> 
#import "Photo.h" 

int main(int argc, const char * argv[]) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    id *photo = [[Photo alloc] init]; 
    [photo setCaption:@"Hello, world!"]; 

    [pool drain]; 
    return 0; 
} 

Cependant, lorsque je tente de compiler, il se plaint d'une référence non définie à Photo. Si je change Photo.h en Photo.m cela fonctionne (vraisemblablement parce qu'il y a une importation de Photo.h en haut de Photo.m).

Cependant, cela ne semble pas être une convention. Comment obtenir l'éditeur de liens pour voir le fichier Photo.h?

Répondre

4

Vous devez compiler Photo.m ainsi que ce fichier principal (par exemple cc -framework Foundation Photo.m main.m). Importer simplement l'en-tête n'est pas suffisant pour que GCC compile Photo.m. Incidemment, l'importation d'un fichier d'implémentation est non seulement non conventionnelle, mais elle ne sera pas compilée dans la plupart des cas (en particulier, vous obtiendrez des symboles dupliqués si un fichier définissant des symboles globaux est inclus plusieurs fois).

1

Une référence non définie n'a rien à voir avec les en-têtes manquants, ce qui indiquerait plutôt qu'il existe des en-têtes non déclarés. Maintenant, ce que cela signifierait, c'est que votre classe Photo.m n'est pas compilée, vérifiez les paramètres de votre projet et vérifiez que le fichier est compilé et lié à votre exécutable, et l'erreur devrait disparaître.

Sidenote: il est inutile d'inclure un fichier .m, car ils contiennent des détails d'implémentation (qui ne vous intéressent pas) et pas d'en-têtes (ce qui devrait vous intéresser).

0

Vous devez également vérifier si PhotoM est activé pour la cible souhaitée. Sinon, il n'est pas compilé et l'éditeur de liens ne parvient pas à le trouver.

Questions connexes