Ist es sicher, eine Verbindung zu einer statischen Bibliothek herzustellen, die mit verschiedenen Compiler-Flags erstellt wurde?

8

Ich verwende GoogleTest zum Testen meiner C ++ - Projekte, und nachdem ich festgestellt habe, dass vorkompilierte Bibliotheken nicht mehr im Ubuntu-Paket verteilt sind, habe ich Folgendes auf der Projekt-Website gefunden:

  

Wenn Sie Google Test und Ihren Testcode mit einem anderen Compiler kompilieren   Flags, können sie verschiedene Definitionen derselben sehen   Klasse / Funktion / Variable (z. B. aufgrund der Verwendung von #if in Google Test).   Aus diesem Grund empfehlen wir für Ihre Gesundheit, die Installation zu vermeiden   vorkompilierte Google Test-Bibliotheken. Stattdessen sollte jedes Projekt   kompiliere Google Test selbst so, dass es sicher sein kann, dass das selbe ist   Flags werden sowohl für Google Test als auch für die Tests verwendet.

Ich nehme an, dass es eine schlechte Idee ist, GoogleTest getrennt von dem zu testenden Projekt zu erstellen. Was ich nicht verstehe, ist, ob dies nur eine GoogleTest-Sache ist oder ob dies allgemein für das Verknüpfen von Bibliotheken ist.

Frage

Gibt es eine Situation, in der es nicht sicher ist, auf vorkompilierte Bibliotheken von Drittanbietern, Compiler-Flags oder auf andere Weise zu verlinken, und wenn nicht, was ist das Besondere an GoogleTest?

    
Chris Wilson 12.10.2012, 21:10
quelle

1 Antwort

6

Es gibt einige Compiler-Flags, insbesondere diejenigen, die mit Alignment arbeiten, die ein Problem verursachen könnten.

GCC i386 und x86-64-Flags

-malign-double
-mno-align-double

    Legen Sie fest, ob GCC Double-, Long-Double- und Long-Long-Variablen an einer Zwei-Wort-Grenze oder einer Ein-Wort-Grenze ausrichtet. Das Ausrichten von Doppelvariablen an einer Zwei-Wort-Grenze erzeugt einen Code, der auf einem Pentium auf Kosten von mehr Speicher etwas schneller läuft.

    Auf x86-64 ist -malign-double standardmäßig aktiviert.

    Achtung: Wenn Sie den -malign-Doppelschalter verwenden, Strukturen, die die oben genannten Arten enthalten, anders als die veröffentlichte Application Binary Interface Spezifikationen ausgerichtet sind, für die 386 und ist nicht binärkompatibel mit Strukturen im Code, ohne dass Schalter kompilieren

Zum Beispiel mit dieser Flagge auf einem 32-Bit-System wird für Doppel- und lange sehnt 64-Bit ausgerichtet sein. Wenn Sie eine Bibliothek ohne das Flag kompilieren, dann versuchen, die Bibliothek zu verwenden, während die Flagge mit Strukturen, die die oben genannten Typen enthalten können unterschiedliche Ausrichtungen haben und nicht interoperabel.

Andere (viel einfacher) Fällen kann auch die gleiche Menge von #defines werden, die sicherstellen, die gleiche Funktion / Struktur / Klassendefinitionen verwendet (und andere solche ODR Verletzungen) zu gewährleisten. Zum Beispiel ist die Verwendung von ‚--std = c ++ 11‘ in gcc, die die C ++ 11-Versionen der Standard Library-Klassen, die in einigen Fällen sind anders als die vorherigen Versionen.

ermöglicht     
Dave S 12.10.2012, 21:24
quelle