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?
Es gibt einige Compiler-Flags, insbesondere diejenigen, die mit Alignment arbeiten, die ein Problem verursachen könnten.
-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öglichtTags und Links c++ googletest static-libraries