2009-08-25 6 views
0

J'essaie d'utiliser la fonctionnalité de l'exemple de l'application iPhone AQOfflineRenderTest dans mon application (cette application n'est pas particulièrement important, je pensais juste qu'il vaut la peine de mentionner). J'ai un fichier C++ avec méthode appelée:Utiliser un fichier C++ dans Cocoa iPhone App

void DoAQOfflineRender(CFURLRef sourceURL, CFURLRef destinationURL) 

J'essaie d'appeler cela de ma classe Cocoa Objective-C. L'exemple app j'ai parlé ci-dessus fait cela en déclarant la méthode dans le fichier d'en-tête comme ceci:

- (IBAction)doSomethingAction:(id)sender; 
    @end 
    void DoAQOfflineRender(CFURLRef sourceURL, CFURLRef destinationURL); 

Dans le fichier de mise en œuvre que j'appelle l'doSomethingAction qui appelle renderAudio et exécute le même code:

DoAQOfflineRender(sourceURL, destinationURL); 

quand je reçois exercerai je l'erreur: _DoAQOfflineRender », référencé à partir de: - [MyViewController renderAudio] dans myViewController.o symbole (s) non trouvé collect2: ld retourné 1 état de sortie

Ai-je manqué une référence à cette classe C++? Il n'en spécifie pas un dans l'application exemple mais il s'exécute.

S'il vous plaît, aidez et merci!

Joe

+0

Avez-vous déjà eu une réponse à cette question? Je me bats avec lui maintenant .... Copié l'échantillon d'Apple et utiliser le code exactement comme ils ont dans l'échantillon, mais obtenir l'erreur qu'il ne peut pas trouver le symbole aussi ... –

+0

http://stackoverflow.com/questions/1956475/xcode-iphone-program-using-cpp-file-symbol-not-found –

Répondre

1

Qu'est-ce que vous manque est la mise en œuvre de DoAQOfflineRender - Vous avez oublié de créer un lien dans la bibliothèque où cette routine est définie?

0

Il semble que vous utilisiez .m comme extension pour votre fichier source Objective-C afin que le compilateur pense que vous faites référence à une fonction C. Essayez de changer l'extension en .mm.

0

Pour appeler une fonction C++ à partir d'un fichier C ou Objective-C, vous devez le déclarer avec la liaison extern "C" en C++.

#if __cplusplus 
extern "C" { 
#endif 

void DoAQOfflineRender(CFURLRef sourceURL, CFURLRef destinationURL); 

#if __cplusplus 
} 
#endif 

La raison est que les noms de fonctions C sont modifiées par le codage de leurs types, de sorte que les fonctions avec le même nom, mais différentes signatures deviennent des symboles différents. Par exemple, DoAQOfflineRender(CFURLRef, CFURLRef) devient sans extern "C", mais _DoAQOfflineRender avec elle, ce qui est attendu par C/Objective-C.

+0

Cela signifie-t-il que vous ne pouvez pas surcharger les fonctions C++ et les déclarer tous 'extern 'C" '? – jtbandes

+0

C'est correct. Si vous voulez surcharger, utilisez l'astuce '.mm' pour transformer le fichier Objective-C en un fichier Objective-C++. –

+0

dans l'exemple à: http://developer.apple.com/iphone/library/samplecode/AQOfflineRenderTest/index.html une classe C++ est utilisée sans la déclaration que vous avez faite ci-dessus. Comment font-ils? – Atma

Questions connexes