2014-11-08 21 views
5

Ich versuche, etwas Code in OSX 10.10 mit den neuesten Xcode cmd-Linientools zu kompilieren. Kompilierung funktioniert, aber die Verknüpfung ist ein Albtraum. Zuerst bekomme ich einen Fehler, dass ein Symbol mehrfach definiert ist. Dieser Fehler ist korrekt, aber die Definitionen sind identisch und in Bibliotheken von Drittanbietern, die ich nicht kontrolliere. Ich kann nicht herausfinden, wie ich den Linker zwingen kann, dieses Problem zu ignorieren. Eine wichtige Anmerkung ist, dass der gleiche Code kompiliert, verlinkt und fehlerfrei auf meiner Ubuntu-Box läuft, sowohl unter clang als auch unter gcc. Dieses Linker-Problem tritt nur unter OS X auf. Die Bibliotheken sind statisch.Probleme mit OS X 10.10 verbinden

Das zweite Problem, das ich begegne, ist noch seltsamer. Wenn ich etwas (notwendige) Funktionalität entferne, nur damit ich das Programm kompilieren und verknüpfen kann, erhalte ich die folgende lustige Nachricht, wenn ich es ausführe: "dyld: Symbol nicht gefunden: __ZNSt12future_errorD1Ev". Zum Teufel, und wie repariere ich das? Google war an dieser Front nicht hilfreich.

Antwort

3

OK, also habe ich diese Probleme nach meinem besten Verständnis gelöst. Folgendes habe ich gelernt. Erstens scheint es nicht möglich zu sein, das Problem der statischen Verknüpfung unter OSX mit Apples "spezieller" Version von Clang zu lösen. Kurz vor dem Bearbeiten des Quellcodes der Bibliothek scheint es keine Möglichkeit zu geben, dem Compiler zu sagen, doppelte Symboldefinitionen zu ignorieren. Früher gab es solche Optionen (z. B. -m), aber sie sind alle für eine Weile veraltet. Um dieses Problem anzugehen, musste ich mindestens eine der Bibliotheken dynamisch machen.

Das zweite Problem war aufgrund der Tatsache, dass eine der Bibliotheken, gegen die ich zu verknüpfen versuchte, irgendwie gegen libstdC++ kompiliert wurde. Allerdings will Apples Clam alles gegen libC++ standardmäßig kompilieren. Daher bestand das Problem in der Kompatibilität zwischen den beiden Bibliotheken --- std :: future_error hatte einen unterschiedlichen Namen in beiden Versionen und zur Laufzeit (als ich libC++ benutzte) konnte das Symbol von libstdC++ nicht gefunden werden. Die richtige Lösung für dieses Problem (die ich in das Bullet gebissen habe und getan habe) bestand darin, jede Bibliothek in diesem Projekt mit libC++ neu zu kompilieren, da die beiden Implementierungen der Standardbibliothek im Allgemeinen nicht kompatibel sind.

Wie auch immer, ich hoffe, dass dies für jemand anderen nützlich ist. Ich finde es unglaublich frustrierend, dass Apple anders genug sein muss, um sicherzustellen, dass Builds, die unter mehreren Compilern unter Linux einwandfrei funktionieren, in ihrem Betriebssystem unter ihrer angepassten Version von Clang entsetzlich zerbrechen.

+0

Endlich - eine Lösung für mein Problem bei der Verknüpfung gegen C++ - Bibliotheken. Ich habe ein Upgrade auf Yosemite durchgeführt, Fink neu aufgebaut und festgestellt, dass mein alter Code nicht mehr auf die gleiche Weise verknüpft ist. "Undefinierte Symbole für Architektur x86_64:". Es scheint übrigens, dass es in OSXs ld auch keine Brute-Force-Start-Gruppe/End-Gruppe mehr gibt. –