La compilation de programme contenant extern “C”
Je suis en train d'utiliser un makefile pour compiler un programme quelqu'un d'autre a écrit, en utilisant cygwin. Je reçois beaucoup de messages d'erreur, dont beaucoup se plaignent error: template with C linkage
.
Après une recherche autour pour un peu, il semble que le problème est relié à extern "C"
. Cette ligne est contenue dans le fichier cygwin/usr/include/pthread.h, qui est inclus avec #include < pthread.h >
dans l'un des en-têtes. Et lorsque je supprime cette ligne, la plupart des messages d'erreur disparaît. Mais il y a un peu de gauche, du tri suivant:
/usr/include/pthread.h:67:5: error: previous declaration of ‘int pthread_atfork(void (* )(),void ( *)(), void ( *)())’ with ‘C++’ linkage
/usr/include/sys/unistd.h:136:5: error: conflicts with new declaration with ‘C’ linkage
Personne ne sait comment résoudre ce problème? Je serais ravi de s'asseoir et d'apprendre tout ce genre de choses dans le détail, mais je n'ai pas de temps avant j'ai besoin de ce programme en cours d'exécution..
Ne pas modifier
pthread.h
, qui est le plus probablement raison, vous avez besoin de comprendre pourquoi vous obtenez l'erreur d'origine qui n'est probablement pas là. Premier candidat à je chercherais sont des macros.OriginalL'auteur jorgen | 2013-08-28
Vous devez vous connecter pour publier un commentaire.
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 entrait en conflit avec un système d'inclure le fichier /usr/include/endian.h. Il a été inclus au lieu de l'en-tête système, et causant des problèmes de génération. Les fichiers étaient en conflit, car l'affaire est insignifiant sur Windows. La cause est ce qui est suggéré dans la réponse originale à cette question. La extern C construire une fuite en code C++ involontairement, où les modèles ont été définis, en provoquant l'erreur indiquée.
Je voudrais vérifier pour un "bancales" liaison C construire dans vos fichiers d'en-tête quelque part. Ce serait dans le code que vous avez écrit (pas tout le système en-têtes; celles-ci sont susceptibles de sécurité).
Code dans les en-têtes est enveloppé avec,
sur le dessus:
et au bas:
Si la partie inférieure est manquant, l'effet de la moitié supérieure s'étend dans le code dans d'autres en-têtes involontairement. Cela provoque des problèmes comme vous rencontrez.
Ce que vous pouvez faire est de regarder la séquence de sortie. Exécutez la commande du compilateur est, mais remplacer l'option "-c" par un "-E". La sortie devrait aller dans un fichier spécifié avec l'option "-o" option. Coup d'oeil, et si vous le souhaitez, coller un fichier quelque part et post le lien ici (si vous voulez de l'aide).
Merci pour la suggestion! Le problème est, en regardant les makefiles je ne comprends pas bien ce qu'il se passe, et je ne trouve pas le fichier ci qui inclut pthread.h et commence donc la peine..
Il semble y avoir un fichier nommé endian.h dans le répertoire de compilation. Il interfère avec votre build. Le compilateur est notamment ce fichier au lieu de la norme à partir de /usr/include.
Ah. La capitalisation est pourquoi il fonctionne pour d'autres personnes et pas vous. Sur Windows, l'affaire est insignifiant. Je peux modifier la réponse à tenir compte de cet échange. Ensuite, vous pouvez l'accepter.
OriginalL'auteur Ziffusion
Ce problème survient lorsque votre compilateur est la compilation d'un mélange de code C et C++. La extern "C" syntaxe est une façon de dire au compilateur C++ qu'un compilateur C devrez également accéder à cette fonction. Le compilateur C ne comprends pas cette utilisation de l'externe, donc en général, vous le cacher comme ceci:
Cependant, vous ne devriez pas aller changer de système en-têtes, les chances de ceux qui sont mal sont très minces. Plus probablement l'un de vos propres en-têtes manque l'accolade de fermeture ci-dessus.
OriginalL'auteur jhauris
De similarité pour la accepté de répondre, c'était une imbrication problème pour moi aussi, mais pas avec
ifdef/endif
, je suis donc l'ajout d'une référence pour les autres.Dans mon cas, cette erreur a été causée par des
extern "C"
constructions; un fichier d'en-tête contenant unextern "C"
construire a été inclus l'intérieur d'un autreextern "C"
construire, causant de nidification que confondre le compilateur/préprocesseur.Fichier un.h:
Fichier b.h
Le déplacement de la
#include "b.h"
à l'extérieur de laa.h
extern "C"
construire résout le problème.OriginalL'auteur origo