2010-09-21 4 views
0

Donc, je travaille depuis quelque temps sur la connexion de hachage d'une application triviale, comprenant C++ et Objective-C, pour prouver quelques concepts et essayer d'apprendre quelque chose.Mélanger C++ et Objective-C (problème d'Automake suspecté)

est ici où je suis maintenant, ma commande (en cours d'exécution, et réexécution des changements) est

$ autoreconf -vis && make clean && ./configure && make && ./src/greetings 

Notez que j'espère que ça va fonctionner quand je suis fait , voici une brève liste des fichiers:

 
$ find . | ack '\.(?:cpp|mm|h)$' 
./src/darwin/greet.cpp 
./src/darwin/greeting.h 
./src/darwin/greeting.mm 
./src/greet.h 
./src/main.cpp 
./src/mingw32/greet.cpp 
./src/mingw32/greet.h 

Les fichiers en entier, peuvent être trouvés dans ce Gist at Github.

Plutôt que d'être un problème spécifique avec le mélange des langues (je ne fais même pas jusque-là) - je semble tomber par hasard au compilateur ne reconnaît pas que ce Objective-C (ou ObjecC++) - pour cette raison, mon autoconf les fichiers sont en this gist.

Avec la sortie d'erreur complète here, also in a Gist.

Voici un exemple:

 
In file included from /usr/include/c++/4.2.1/iosfwd:48, 
       from /usr/include/c++/4.2.1/ios:43, 
       from /usr/include/c++/4.2.1/ostream:45, 
       from /usr/include/c++/4.2.1/iostream:45, 
       from darwin/greet.cpp:10: 
/usr/include/c++/4.2.1/bits/stringfwd.h:48: error: template with C linkage 
/usr/include/c++/4.2.1/bits/stringfwd.h:51: error: template with C linkage 
/usr/include/c++/4.2.1/bits/stringfwd.h:54: error: template with C linkage 
/usr/include/c++/4.2.1/bits/stringfwd.h:58: error: template specialization with C linkage 
/usr/include/c++/4.2.1/bits/stringfwd.h:63: error: template specialization with C linkage 
In file included from /usr/include/c++/4.2.1/iosfwd:49, 
       from /usr/include/c++/4.2.1/ios:43, 
       from /usr/include/c++/4.2.1/ostream:45, 
       from /usr/include/c++/4.2.1/iostream:45, 
       from darwin/greet.cpp:10: 
+0

Avez-vous essayé de renommer les fichiers '.cpp' avec l'extension' .mm'? –

+0

Oui, si je fais cela alors l'automake ne trouve aucun fichier d'entrée, cependant quand je commente la ligne 'greetings_CFLAGS = -framework -Xlinker Foundation' dans'./Src/Makefile.am' alors les erreurs changent toutes en quelque chose comme ' /usr/include/c++/4.2.1/bits/istream.tcc:406: error: template avec C linkage' –

+0

Pouvez-vous ajouter 'Makefile' ou' Makefile.in' à votre liste? Je me demande si une règle de suffixe pour '.mm -> $ (OBJEXT)' est manquante et c'est pourquoi il n'y a pas de fichier d'entrée. –

Répondre

0

De jouer avec le fichier zip, voici ce que je recommande:

utiliser une interface C uniquement sur la frontière linguistique. Cela évitera le support Objective-C++ inexistant d'automake. Utilisez l'astuce

#ifdef __cplusplus 
extern "C" 
#endif 

sur vos têtes pour faire en sorte que le compilateur C va générer des fonctions C et le compilateur Objective-C peut gérer les en-têtes. Cela permettra au code Objective-C d'appeler votre interface.

Configurez votre arbre source que vous avez avant: code commun dans src/, le code spécifique à l'OS dans src/darwin, src/msdos (: P), src/win32 et ainsi de suite. Afficher toutes les sources dans EXTRA_foo_SOURCES dans Makefile.am.

En configure.ac, test de la plateforme que vous compilez et utilisez AM_CONDITIONAL pour définir des indicateurs qui Makefile.am peut lire (vous avez fait cela correctement déjà).

En Makefile.am, utilisez les conditionals pour inclure les sources correctes:

if OS_DARWIN 
    foo_SOURCES += darwin/foo.m darwin/bar.h darwin/baz.m 
    foo_LDFLAGS = -Wl,-framework,Foundation 
endif 

Notez qu'en raison de how the linker is chosen, un lien C sera tenté de. Les indicateurs de liaison supplémentaires pour créer le lien de code Objective-C doivent être dans foo_LDFLAGS.Ce qui s'est passé dans votre cas était le suivant: Dans greet.h, vous n'avez pas déclaré void greet(); comme extern "C". Cela signifiait que lorsque main.cpp était compilé, il s'attendait à un void greet() qui avait une liaison C++ (dans mon cas, le symbole était greet). darwin/greet.cpp a été compilé et avait void greet() déclaré comme extern "C", de sorte qu'il a produit une version C (avec le symbole _greet). La liaison a ensuite échoué car l'éditeur de liens s'attendait à un symbole greet, mais rien ne le prévoyait.

0

Votre « modèle avec lien C » problème est dû à l'intérieur du bloc #include <iostream>extern "C". Essayez quelque chose comme ceci:

#include <CoreFoundation/CoreFoundation.h> 
#include <iostream> 

/* In a #ifdef __cplusplus block, if you want. */ 
extern "C" 
void greet() { 
    /* ... */ 
} 

Cela fera greet() ont une liaison C, sans les en-têtes se mal interprétés.

+0

Merci, ça a beaucoup plus de sens, quand je fais cela cependant - le problème est qu'il revient à ne pas trouver le symbole greet()? –

Questions connexes