10
votes

Programme de compilation contenant extern "c"

J'essaie d'utiliser un maquillage pour compiler un programme que quelqu'un d'autre a écrit, en utilisant Cygwin. Je reçois beaucoup de messages d'erreur, dont beaucoup de plaignant Erreur: Modèle avec CLAIGE C .

Après avoir effectué une recherche autour d'un peu, le problème est connecté à extern "C" < / code>. Cette ligne est contenue dans le fichier cygwin / usr / include / pthread.h , qui est incluse avec #include dans l'un des en-têtes. Et quand je supprime cette ligne la plupart des messages d'erreur disparaissent. Mais il reste quelques-uns à gauche, du genre suivant: xxx

Est-ce que quelqu'un sait comment résoudre ce problème? J'aimerais m'asseoir et apprendre tout cela en détail, mais je n'ai pas le temps avant d'avoir besoin de ce programme.


2 commentaires

Nous ne pouvons pas beaucoup faire pour vous aider sans voir le code réel que vous essayez de compiler.


Ne modifiez pas pthread.h , c'est très probablement juste, vous devez déterminer pourquoi vous obtenez l'erreur d'origine qui n'est probablement pas là. Premier candidat que je rechercherais sont des macros.


3 Réponses :


9
votes

Ce problème se pose lorsque votre compilateur compilait un mélange de code C et C ++. La syntaxe externe "C" est un moyen de dire au compilateur C ++ qu'un compilateur C devra également accéder à cette fonction. Le compilateur C ne comprend pas cette utilisation de l'extérieur, si typiquement vous le cachez comme ceci:
XXX

Cependant, vous ne devriez pas aller changer les en-têtes du système, les chances de ceux-ci mal sont très minces. Plus probablement, l'un de vos propres en-têtes manque le support de fermeture ci-dessus.


0 commentaires

11
votes

Edit: basé sur l'échange dans les commentaires, le coupable était un fichier d'en-tête dans le répertoire de construction (Endian.h) qui en conflit avec un système inclut le fichier /usr/include/endian.h. Il était inclus au lieu de l'en-tête du système et causant des problèmes de construction. Les dossiers étaient en conflit car l'affaire est insignifiante sur Windows. La cause fondamentale était ce qui a été suggéré dans la réponse originale. La construction externe C fuit dans le code C ++ involontairement, où des modèles ont été définis, provoquant l'erreur indiquée.

Je vérifierais une construction de liaison de "pendling" dans vos fichiers d'en-tête quelque part. Ce serait dans le code que vous avez écrit (pas l'un des en-têtes système; ceux-ci sont probablement sûrs).

code dans les en-têtes est enveloppé avec,

sur le dessus: < Pré> xxx

et en bas: xxx

si la partie inférieure est manquante, l'effet de la moitié supérieure s'étend dans le code dans d'autres en-têtes involontairement. Cela provoque des problèmes tels que vous rencontrez.


9 commentaires

@ Jonp.Harris L'étrange chose est, comme je l'ai mentionné, je n'ai pas écrit le code moi-même et je suis positif, cela fonctionne pour d'autres personnes. J'ai cherché le code que vous mentionnez dans les en-têtes, mais je ne peux pas le trouver jusqu'à présent. Cependant, je soupçonne que les auteurs utilisent Linux, tandis que j'utilise Windows et que Googling autour semble qu'il pourrait y avoir un problème avec Pthread et Cygwin sous Windows?


@Jorgen Ce que vous pouvez faire est de regarder la sortie prétraitée. Exécutez la commande Compiler comme c'est tout, mais remplacez l'option "-c" avec "-E". La sortie doit entrer dans un fichier spécifié avec l'option "-O". Regardez-le, et si vous aimez, Coller le fichier quelque part et post-lien ici (si vous voulez de l'aide).


Merci pour la suggestion! Le problème est que je regarde les maquillages que je ne comprends pas beaucoup de ce qui se passe, et je ne trouve pas le fichier mentionné qui inclut pthread.h et commence donc le problème ..


Vous pouvez simplement couper et coller la commande de la sortie de la sortie dans la coque et l'exécuter. La commande serait une invocation GCC qui devrait précéder les messages d'erreur. Cela devrait fonctionner aussi longtemps que vous êtes dans le bon répertoire.


Au fait, la dernière partie de la commande est "-e -o garbageflag.o garbageflag.cc", j'ai supposé que c'était le fichier .o que vous vouliez dire


Il semble y avoir un fichier nommé endian.h dans le répertoire dans lequel vous compilez. Il interfère avec votre construction. Le compilateur comprend ce fichier au lieu de la norme de / usr / include.


D'accord! À partir de l'apparence, les deux fichiers sont complètement différents (par la manière dont l'un dans mon répertoire est capitalisé, comme dans Endian.h, je suppose que cela n'aide pas). Je vais essayer de le renommer et changer partout, il est inclus.


J'ai renommé le fichier et il a supprimé l'erreur (bien qu'il n'y ait pas d'autres, je vais me couper les dents sur ceux suivants). Merci beaucoup! Je suppose qu'il n'y a aucun moyen d'accepter un commentaire comme une réponse?


Ah. La capitalisation est la raison pour laquelle cela fonctionne pour les autres personnes et pas vous. Sous Windows, l'affaire est insignifiante. Je peux éditer la réponse pour refléter cet échange. Ensuite, vous pouvez l'accepter.



2
votes

Similarité avec la réponse acceptée, c'était un problème de nidification pour moi aussi, mais pas avec ifdef / endif , donc je ajoute comme une référence pour les autres.

dans mon cas , cette erreur a été causée par des constructions NOTED EXTERT "C" ; Un fichier d'en-tête contenant un externe "c" construct a été inclus à l'intérieur d'un autre extern "C" construction, causant la nidification confondue le compilateur / préprocesseur.

fichier ah: xxx

fichier bh xxx

déplacer le #include " bh " en dehors du ah extern" c " construire corrige le problème.


0 commentaires