2017-06-01 2 views
0

Ich versuche, Python in mein C++ - Projekt einzubetten. Ich muss es tun, um einige Funktionen zu verwenden, die den Kolmogorov-Smirnov-Test implementieren, die in C++ nicht verfügbar sind.Legen Sie Xcode-Flags fest, um Python in mein C++ - Projekt einzubetten

Jetzt versuche ich nur zu sehen, ob Xcode in der Lage ist, ein einfaches Programm zu verlinken und zu kompilieren, das Python einbettet. Der Code, den ich zu kompilieren ich versucht, ist die folgende:

#include<Python/Python.h> 

int main(int argc, const char * argv[]) { 

    Py_Initialize(); 
    PyObject* variable; 
    Py_Finalize(); 
    return 0; 
} 

Soweit ich aus den Anweisungen verstehen kann ich hier gelesen habe: 1. Embedding Python in Another Application - 1.6 Compiling and Linking under Unix-like systems und hier: Python/C API Reference Manual - Introduction dafür, um zu kompilieren, muss ich hinzufügen einige zusätzliche Flags für den Compiler und den Linker.

Um heraus zu finden, welche Flags soll ich hinzufügen, habe ich die folgenden zwei Befehle in meinem Terminal läuft (von denen ich schließe die entsprechende Ausgabe):

$ python3.6-config --cflags   
-I/Users/user/anaconda3/include/python3.6m -I/Users/user/anaconda3/include/python3.6m -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/user/anaconda3/include -arch x86_64 -I/Users/user/anaconda3/include -arch x86_64 

$ python3.6-config --ldflags 
-lpython3.6m -ldl -framework CoreFoundation -Wl,-stack_size,1000000 -framework CoreFoundation 

Wo ich die tatsächlichen Namen ersetzt von Mein Benutzerordner mit user.

Nun, um diese Flags zum Xcode Compiler und Linker hinzuzufügen, ging ich zu meinem Projekteinstellungen Fenster und unter Build Settings -> Other C Flags und Build Settings -> Other Linker Flags habe ich die Flags hinzugefügt, die ich oben gemeldet habe.

Aber wenn ich kompilieren ich diesen Fehler:

Apple Mach-O Linker (ld) Error Group 
clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Und es geht nicht weg, auch wenn ich mit Ausnahme return 0 alle Linien in der main Funktion kommentieren.

Ich verstehe nicht, was ich falsch mache.

Ich Xcode 8.3.2 und meine Python-Distribution verwenden ist: Python 3.6.1 |Anaconda 4.4.0

Antwort

0

Ok, ich glaube, ich eine Lösung gefunden habe. Nicht sicher, ob es wirklich der richtige ist (da ich kein Experte bin und ich nicht wirklich den Grund verstehe, warum es jetzt funktioniert), aber ich werde es trotzdem posten.

Die Sache ist die, dass, wenn man sich die Anweisungen in dieser Seite aussehen: 1. Embedding Python in Another Application - 1.6. Compiling and Linking under Unix-like systems können Sie sehen, dass beim Ausführen des Befehls python3.6-config --ldflags die Ausgabe enthält einen Flag -L/opt/lib/python3.4/config-3.4m während in meinem Fall ist es nicht.

Nachdem ich herausgefunden habe, dass das Flag, das mir den Verknüpfungsfehler gab, -lpython3.6m war, dachte ich, dass es vielleicht daran lag, dass der Linker das Verzeichnis nicht finden konnte, in dem meine Python-Distribution war oder so ähnlich.

Also suchte ich in meiner Festplatte nach einem Pfad zu einem Ordner mit einem Namen ähnlich dem auf der Webseite und ich fand, dass /Users/user/anaconda3/lib/python3.6/config-3.6m-darwin ein Pfad zu einem Ordner mit einem Namen sehr ähnlich zu dem, den ich suchte für, außer für die "-Darwin" am Ende des Namens des Ordners, die wahrscheinlich da ist, weil ich auf einer MacOS-Distribution bin (vielleicht ist das der Grund, warum der Befehl python3.6-config --ldflags es nicht gefunden habe? Ich weiß es nicht).

Danach habe ich gerade -L/Users/user/anaconda3/lib/python3.6/config-3.6m-darwin am Anfang von Xcode "Andere Liker Flags" und alles (fast) kompiliert einfach gut hinzugefügt.

Ich sage „fast“, weil ich auch die include am Anfang meines Codes von #include<Python/Python.h> zu #include<Python.h> (vielleicht mit Hilfe des ersten, weil umbenennen musste, während ich mit der System-Standard-Python-Distribution mit den zweiten I‘ m einschließlich der Anaconda One? Wieder, ich weiß es nicht).

Wie auch immer jetzt alles kompiliert gut und so dachte ich mir zu teilen, wie ich es getan habe, falls jemand anderes in der gleichen Situation ist.

Verwandte Themen