2010-08-13 5 views
4

Je tente d'écrire mon premier cadre Cocoa personnalisé et je souhaite exposer une fonction C simple de l'infrastructure qui englobe tout un tas de fonctionnalités, tout comme le fait NSApplicationMain. Quand j'ai simplement importé les fichiers directement depuis le projet, tout s'est bien passé, le projet a été construit et ma fonction C a été appelée correctement.Affichage de la fonction C à partir du framework Objective-C personnalisé

Maintenant, j'ai un nouveau projet de cadre de cacao qui contient les fichiers, je ne peux pas construire mon programme parce que je reçois des messages d'erreur "Symboles non trouvés", spécifiquement pour ma fonction C.

J'ai essayé de préfixer la définition de la fonction dans le fichier d'en-tête avec extern, mais toujours rien.

Quelqu'un peut-il me prévenir? Comment puis-je exposer des fonctions C standard via Cocoa Framework personnalisé?

idée approximative de ce que je fais:

Mon programme qui utilise mon cadre personnalisé:

#import <BDWebApplicationFramework/BDWebApplication.h> 

int main (int argc, const char * argv[]) { 
    return BDWebApplicationMain(argc, (const char **)argv); 
} 

Mon tête-cadre: BDWebApplication.h

#import <Foundation/Foundation.h> 

@interface BDWebApplication : NSObject { 
    NSString *name; 
} 
@property (readwrite, copy) NSString *name; 

@end 

extern int BDWebApplicationMain(int argc, const char * argv[]); 

Mon fichier cadre: BDWebApplication.m

#import "BDWebApplication.h" 

@implementation BDWebApplication 

@synthesize name; 

- (id)init 
{ 
    [super init]; 
    name = @"New name"; 
    return self; 
} 

- (void)dealloc 
{ 
    [name release]; 
    [super dealloc]; 
} 

@end 

int BDWebApplicationMain(int argc, const char * argv[]) 
{ 
    // Do some Obj-c stuff here 
} 

Répondre

3

Le problème ici est presque certainement enterré dans vos paramètres de construction Xcode, pas dans le code que vous avez posté (ce qui semble bien).

Commençons par le commencement: reliez-vous à votre nouveau framework? En supposant que vous êtes, êtes-vous sûr que vous exportez réellement les symboles que vous pensez que vous êtes lorsque vous construisez le cadre? (Il existe un certain nombre d'options pour spécifier ceci, et certains d'entre eux ont une sémantique qui peut surprendre les imprudents.)

Ce qui serait plus utile pour vous aider à diagnostiquer ceci est le texte intégral des transcriptions de construction Xcode pour les deux la cadre et l'exécutable.

+0

J'ai initialement suivi les instructions trouvées ici: http://atastypixel.com/blog/creating-applications-in-xcode-using-frameworks/ pour créer un projet de cadre dans mon projet de programme, qui devrait également créer un cadre C'est disponible pour tous mes autres projets. Le code source de mon projet est disponible ici, taré et gzipé, pour que vous puissiez l'examiner. C'est juste un téléchargement de 7Mb: http://restafarian.com/stackoverflow/stackoverflow.tgz Merci pour toute aide et conseil que vous pouvez fournir! – omarshariffdontlikeit

+0

Le problème est en effet que votre cible BDWebAppTest n'est pas liée à votre cadre BDWebApplicationFramework (sic). Pour le voir, dévoilez l'arborescence complète des dépendances sous le contour de la cible et notez en particulier l'étape "Lier les binaires avec les bibliothèques". Vous verrez que pour le moment, il ne fait que se lier à Foundation.framework. Vous pouvez résoudre ce problème en faisant glisser votre framework dans la liste des frameworks liés. (Et probablement RegexKit aussi, puisque je suppose que votre projet le référence pour une raison.) –

+0

Excellente substance, qui a fonctionné comme décrit. Pour autant que je sache, je ne devrais pas avoir besoin de lier RegexKit avec mon programme, car cela devrait être lié à mon framework, car c'est seulement mon framework qui utilisera RegexKit en coulisses. Merci pour votre aide, je sais que j'ai dû manquer quelque chose. J'ai posté un commentaire sur le blog original dont j'ai suivi les instructions et lui ai demandé d'ajouter cette étape à ses instructions. J'espère que cela aidera quelqu'un d'autre qui a un problème similaire. – omarshariffdontlikeit

Questions connexes