Frage

Ich bin gerade dabei, ein großes Projekt (~ 1m LOC) von einer Fenster-/Visual -Studio -Umgebung auf andere Plattformen zu portieren, von denen der erste Mac OS X ist.

Ursprünglich wurde das Projekt als Visual Studio -Lösungen und -projekte konfiguriert, aber jetzt verwende ich (die hervorragende) Prämake (http://industriousone.com/premake) zum Generieren von Projektdateien für mehrere Plattformen (vs, xcode, gmake).

Ich habe die ersten Projekte ohne wesentliche Probleme konfiguriert, portiert und erstellt, aber nachdem ich die Mathematik -Bibliothek portiert habe, habe ich diesen seltsamen Verknüpfungsfehler gestoßen, den ich nicht beheben konnte: Alle von Math verwendeten Funktionen werden nicht verknüpft (verursachen ungelöste Symbole).

Als Referenz verwende ich vor Fremake v4.2.1, um Projekte für Xcode v3.2.1 zu generieren, die mit GCC V4.2 für die X86_64 -Architektur aufgebaut werden. (All dies auf 64-Bit-Schnee-Leopard) Ich habe versucht, GCC zu überzeugen, alles gegen einen 'bekannten' SDK zu bauen, indem ich -isysroot /developer/sdks/macosx10.6.sdk -mymacosx-version-Min = 10.6 hinzugefügt hat in die Build -Befehlszeile.

Unter normalen Umständen sollte das Hinzufügen von -lm dies nun darum kümmern, aber in Darwin sind diese Mathematik -Bibliotheken in Libsystem enthalten, was, soweit ich das beurteilen kann, implizit durch GCC/LD verknüpft wird.

Ich habe versucht, ein Dummy -Projekt aus Xcode aus zu erstellen, das gerade ausgeführt wird:

float f = log2(2.0)+log2f(3.f)+log1p(1.1)+log1pf(1.2f)+sin(8.0);
std::cout << f << std::endl;

Und wie erwartet baut sich dies gut auf. Wenn ich jedoch dasselbe in den Code in das Projekt mit vor vor vor fach erzeugtem Projekt aufgenommen habe, werden all diese Mathematikfunktionen ungelöst.

Wenn Sie nun den Verknüpfungsbefehl aus dem "nativen" Xcode -Projekt mit meinem generierten Xcode -Projekt vergleichen, scheinen sie ziemlich identisch zu sein (außer dass mein generiertes Projekt auch andere LIBs verknüpft).

"Native" -Projekt:

/Developer/usr/bin/g++-4.2 -arch x86_64 -dynamiclib -isysroot /Developer/SDKs/MacOSX10.6.sdk -Lsomepath -Fsomepath -filelist somefile -install_name somename -mmacosx-version-min=10.6 -single_module -compatibility_version 1 -current_version 1 -o somename

Erzeugter Projekt:

/Developer/usr/bin/g++-4.2 -arch x86_64 -dynamiclib -Lsomepath -Fsomepath -filelist somefile -install_name somename -isysroot /Developer/SDKs/MacOSX10.6.sdk -mmacosx-version-min=10.6 somelib.a somelib2.a somelib.dylib somelib2.dylib -single_module -compatibility_version 1 -current_version 1 -o somename

Jede Hilfe oder Hinweise darauf, wie man vorgehen soll, wäre am meisten geschätzt. Gibt es GCC -Flags oder andere Tools, die mir helfen können, dies zu lösen?

War es hilfreich?

Lösung

Ich habe es endlich geschafft, dies zu lösen/zu arbeiten.

Durch Ersetzen

#include <math.h>
float f = sinf(1.f);

mit

#include <cmath>
float f = std::sin(1.f);

Alles verknüpft wie erwartet.

Ich werde die Tatsache akzeptieren, dass die CMATH -Lösung wahrscheinlich der Code ist, den ich in erster Linie hätte schreiben sollen, obwohl ich gerne weitere Meinungen darüber akzeptieren würde, warum mein C -Ansatz so kläglich gescheitert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top