Mehrfache Definition von Inline-Funktionen beim Verknüpfen von statischen Bibliotheken

Ich habe ein C ++ - Programm, das ich mit mingw (gcc für Windows) kompiliere. Verwenden der TDM-Version von mingw, die gcc enthält 4.4.1. Die ausführbaren Links zu zwei statischen Bibliotheksdateien (.a): Eine davon ist eine in C geschriebene Drittanbieter-Bibliothek. Die andere ist eine von mir geschriebene C ++ - Bibliothek, die unter Verwendung der C-Bibliothek meine eigene C ++ - API bereitstellt.

Ein (meiner Ansicht nach zu großer) Teil der Funktionalität der C-Bibliothek ist in Inline-Funktionen implementiert. Sie können es nicht vermeiden, die Inline-Funktionen einzuschließen, wenn Sie die API der C-Bibliothek verwenden, aber wenn ich versuche, alles miteinander zu verknüpfen, erhalte ich Verknüpfungsfehler, die besagen, dass alle Inline-Funktionen mehrfach definiert sind - beides habe ich In meiner C ++ - Wrapperbibliothek aufgerufen und in denen, die ich nicht habe, hat im Grunde genommen alles, was in den Headern inline definiert ist, eine Funktion dafür erstellt, sowohl in der C-Bibliothek als auch in der C ++ - Bibliothek.

Es verursacht keine Fehler bei der Mehrfachdefinition, wenn die Include-Dateien in verschiedenen .c- oder .cpp-Dateien im selben Projekt mehrmals verwendet werden. Das Problem ist nur, dass es eine Definition pro Bibliothek generiert.

Wie / warum generiert der Compiler Funktionen und Symbole für diese Inline-Funktionen in beiden Bibliotheken? Wie kann ich erzwingen, dass sie in meinem Code nicht mehr generiert werden? Gibt es ein Tool, das ich ausführen kann, um die doppelten Funktionen aus der .a-Datei zu entfernen, oder eine Möglichkeit, den Linker dazu zu bringen, mehrere Definitionen zu ignorieren?

(Zu Ihrer Information, die Drittanbieter-Bibliothek enthält in allen Kopfzeilen #ifdef __cplusplus und externe "C" -Wächter. Wenn dies jedoch das Problem wäre, würde dies keine Mehrfachdefinition des Symbols verursachen, da das Symbol das entgegengesetzte Problem verursachen würde undefiniert oder zumindest anders sein.)

Insbesondere treten die Verbindungsfehler NICHT auf, wenn ich eine Verbindung zur DLL der C-Bibliothek eines Drittanbieters herstelle. Allerdings treten dann merkwürdige Laufzeitfehler auf, die damit zu tun zu haben scheinen, dass mein Code eine eigene Version von Funktionen hat, die er von der DLL aufrufen sollte. (Als ob der Compiler lokale Versionen von Funktionen erstellt, nach denen ich nicht gefragt habe.)

Ähnliche Versionen dieser Frage wurden bereits gestellt, aber ich habe in keiner der folgenden Situationen eine Antwort auf meine Frage gefunden:

Die Antwort auf diese Frage war, dass das Plakat vielfach definierend warVariablenMein Problem ist die mehrfache Definition von Inline-Funktionen:Wiederholte Fehler bei mehreren Definitionen, da derselbe Header in mehreren Cpps enthalten war

Dies war ein MSVC-Programm, aber ich benutze mingw; Das Problem des Posters in dieser Frage war auch die Definition eines C ++ - Klassenkonstruktors außerhalb des Klassenkörpers in einem Header, während mein Problem bei C-Funktionen liegt, die inline sind:Statische Bibliothek Multiple Definition Problem

Dieser Idiot hat seinen gesamten C-Code in C ++ - Dateien umbenannt und sein C-Code war nicht C ++ -sicher:Mehrfachdefinition vieler std :: -Funktionen beim Verknüpfen

Dieser wollte nur wissen, warum das Verstoßen gegen die eine Definitionsregel kein Fehler war:unvorhersehbares Verhalten von Inline-Funktionen mit unterschiedlichen Definitionen

Antworten auf die Frage(1)

Ihre Antwort auf die Frage