2016-08-10 3 views
-1

Ich habe den ursprünglichen Code, der unter gcc in Windows und Linux kompiliert werden soll. Es funktioniert gut unter Cygwin. Jetzt, wenn ich versuche, für iOSMakro posix_c_source

echo $OSTYPE 
darwin14 

zu kompilieren, scheint alles in Ordnung und ein Build ist erfolgreich erhalten. Wenn ich jedoch versuchte, die CUI-App auszuführen, wird eine Meldung Segmentierungsfehler 11 angezeigt.

Nach ein paar Tagen Suche im Internet, durch Zufall habe ich diese link gefunden.

Als Ergebnis habe ich die folgende Änderung in einer der * .c Datei

-#define _POSIX_C_SOURCE 199309 
+#define _POSIX_C_SOURCE 199506 

und dem neuen Build funktioniert gut. Obwohl ich kein Programmierer bin, frage ich mich, was zwischen diesen beiden Makros so signifikant anders wäre? Können Sie etwas dazu sagen, warum solch ein Wandel so wichtig wird?

+3

Wenn Sie einen Absturz wie Segmentierungsfehler erhalten, sollte Ihre erste Aktion nicht dazu, spezielle Makros neu zu definieren. Stattdessen sollte es sein, die Anwendung zu debuggen, den Ort und die Ursache des Absturzes zu finden. Nur weil es * scheint * zu funktionieren, ist es nicht garantiert, dass das zugrundeliegende Problem tatsächlich behoben ist. Möglicherweise haben Sie weiterhin das undefinierte Verhalten im Code, und der Absturz (oder ein anderes unerwartetes Verhalten) kommt möglicherweise zurück, wenn Sie es am wenigsten erwarten. –

+2

Ist Ihr Code multi-threaded? Das könnte es erklären, weil '199506' Threads eingeführt hat (und ohne sie enthält Ihre C-Bibliothek möglicherweise keine Thread-Sicherheitskonstrukte). Ansonsten ist es schwer zu sagen, ohne einen Code anzusehen. –

+0

@Joachim: Danke für Ihren Vorschlag. Ich bin mir bewusst, dass meine Herangehensweise keine professionelle ist. Leider sind meine Debugging-Fähigkeiten fast nicht vorhanden. – AjanO

Antwort

1

obwohl es nur eine Zeile Code ist, aber es kann einen großen Unterschied machen, POSIX ist ein Standard, es definiert die Schnittstelle zwischen Betriebssystem und Anwendungen, und es hat viele verschiedene Versionen (Sie können es ähnlich mit einer Hardware USB denken Standard, es hat viele Versionen, wie USB 1.0 und USB 2.0).

manchmal Programmierer kann nicht feststellen, auf welcher Plattform das Programm arbeiten wird, es kann auf Linux laufen, kann auf Windows laufen, vielleicht bietet das System alte Standardschnittstelle, vielleicht eine neue.

Also, Programmierer, diese Art von Makros hinzufügen, schreiben Codes für viele andere Schnittstelle, beispielsweise einen Quellcode wie folgt aus:

#define WIN 
#ifdef WIN 
    <part 1:1000 lines of code> 
#endif 
#ifdef LINUX 
    <part 2:1000 lines of code> 
#endif 
    <1000 lines that not depend on system , can both run on Linux and Windows.> 

der Compiler Teil 1 (Discard Teil 2) kompilieren, aber wenn Sie ändern #define WIN zu #define LINUX, es wird Teil 2 enthalten (und verwerfen Teil 1)! Sie können denken, dass Sie nur 1 Zeile geändert haben, aber der Compiler kann Tausende von Zeilen auswählen oder verwerfen (möglicherweise sogar mehr, vielleicht weniger, die vom Code abhängen)

+0

Haben Sie Ihren Punkt! Danke. – AjanO