Kompilieren-Programm mit extern "C"
Ich versuche, ein makefile zu kompilieren Sie ein Programm, das jemand anderes geschrieben hat, mit cygwin. Ich bekomme eine Menge Fehlermeldungen, von denen viele beschweren sich error: template with C linkage
.
Nach der Suche rund um für ein bisschen es scheint, das problem ist verbunden mit extern "C"
. Diese Zeile ist in der Datei enthalten cygwin/usr/include/pthread.h, die mit #include < pthread.h >
in einem der Header. Und wenn ich diese Zeile zu entfernen die meisten Fehlermeldungen verschwinden. Aber es gibt ein paar Links, von der folgenden Art:
/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
Weiß jemand, wie man dieses Problem beheben? Ich würde lieben zu sitzen und all dieses Zeug im detail, aber ich habe keine Zeit, bevor ich brauche dieses Programm läuft..
- Es gibt nicht viel was wir tun können, um Ihnen zu helfen ohne zu sehen, den eigentlichen code, den du versuchst zu kompilieren.
- Nicht ändern
pthread.h
, ist, dass die meisten wahrscheinlich Recht, Sie brauchen, um herauszufinden, warum man den ursprünglichen Fehler, die die meisten wahrscheinlich nicht da. Erster Kandidat, ich würde Aussehen, sind Makros.
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT: Basierend auf dem Austausch in den Kommentaren, der Täter war einer header-Datei in das build-Verzeichnis (Endian.h), die in Konflikt mit einem system-include-Datei /usr/include/endian.h. Es wurde aufgenommen, anstatt die system-header und bauen verursacht Probleme. Die Dateien wurden in Konflikt, weil Fall unerheblich ist, auf Windows. Die Ursache war das, was angedeutet war in der ursprünglichen Antwort. Der extern-C-Konstrukt war undicht in C++ - code unabsichtlich, wo Vorlagen definiert wurden, wodurch die angegeben Fehler.
Ich würde prüfen, ob eine "baumelnde" C Verknüpfung konstruieren Sie in Ihrer header-Dateien irgendwo. Dies wäre der code, den Sie schrieb (nicht die system-Header; diese sind wahrscheinlich sicher).
Code in Header verpackt ist mit,
oben:
und unten:
Wenn der untere Teil fehlt, wird die Wirkung der oberen Hälfte in erweitert-code in andere Header unabsichtlich. Das führt zu Problemen, wie Sie auftreten.
Dieses problem entsteht, wenn dein compiler kompilieren eine Mischung aus C-und C++ - code. Die extern "C" syntax ist ein Weg, zu sagen, die C++ - compiler, C compiler auch benötigen, um Zugriff auf diese Funktion. Der C-compiler nicht versteht, diese Verwendung von extern, also in der Regel blenden Sie es wie folgt:
Allerdings solltest du nicht gehen, ändern der system-Header, die Chancen derer, die Unrecht haben, sind sehr schlank. Eher eine eigene Header fehlt die schließende Klammer oben.
Ähnlichkeit zu den akzeptierten Antworten, das war ein nesting-problem für mich auch, aber nicht mit
ifdef/endif
, so dass ich bin das hinzufügen als Referenz für andere.In meinem Fall, dieser Fehler wurde verursacht durch verschachtelte
extern "C"
Konstrukte; eine header-Datei, die einextern "C"
Konstrukt enthalten war in einem anderenextern "C"
konstruieren, verursachen Nest, dass verwirrt den compiler/Präprozessor.Datei ein.h:
Datei b.h
Verschieben der
#include "b.h"
außerhalb dera.h
extern "C"
konstruieren, der das problem behebt.