2017-06-01 5 views
0

J'essaie d'intégrer python dans mon projet C++. Je dois le faire pour utiliser certaines fonctions qui implémentent le test de Kolmogorov-Smirnov qui ne sont pas disponibles en C++. Pour l'instant j'essaie juste de voir si Xcode est capable de lier et de compiler un programme simple qui embarque Python. Le code que je suis en train de compiler est la suivante:Définir des drapeaux Xcode afin d'intégrer python dans mon projet C++

#include<Python/Python.h> 

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

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

Pour autant que je peux comprendre des instructions que je l'ai lu ici: 1. Embedding Python in Another Application - 1.6 Compiling and Linking under Unix-like systems et ici: Python/C API Reference Manual - Introduction pour que cela compiler je dois ajouter des drapeaux supplémentaires au compilateur et à l'éditeur de liens.

Pour savoir quels drapeaux dois-je ajouter, j'ai couru les deux commandes suivantes dans mon terminal (dont j'inclus la sortie correspondante):

$ 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 

Lorsque j'ai remplacé le nom réel de mon dossier utilisateur avec user. Maintenant, afin d'ajouter ces drapeaux au compilateur et à l'éditeur de liens Xcode, je suis allé à ma fenêtre de paramètres de projet et sous Build Settings -> Other C Flags et Build Settings -> Other Linker Flags j'ai ajouté les drapeaux que j'ai rapportés ci-dessus.

Mais quand je compile je reçois cette erreur:

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

Et il ne disparaît pas, même si je commente toutes les lignes de la fonction main à l'exception de return 0.

Je ne comprends pas ce que je fais mal.

J'utilise Xcode 8.3.2 et ma distribution Python est: Python 3.6.1 |Anaconda 4.4.0

Répondre

0

Ok, je pense que je l'ai trouvé une solution. Je ne sais pas si c'est vraiment la bonne (puisque je ne suis pas un expert et je ne comprends pas vraiment la raison pour laquelle maintenant ça marche), mais je vais le poster quand même.

La chose est que si vous regardez les instructions de cette page: 1. Embedding Python in Another Application - 1.6. Compiling and Linking under Unix-like systems vous pouvez voir que lors de l'exécution de la commande python3.6-config --ldflags la sortie contient un drapeau -L/opt/lib/python3.4/config-3.4m alors que dans mon cas, il ne fonctionne pas. Donc, après avoir découvert que le drapeau qui m'a donné l'erreur de liaison était -lpython3.6m, je pensais que c'était peut-être dû au fait que l'éditeur de liens ne trouvait pas le répertoire dans lequel se trouvait ma distribution python ou quelque chose comme ça.

J'ai donc regardé sur mon disque dur un chemin d'accès à un dossier avec un nom similaire à celui affiché sur la page Web et j'ai trouvé que /Users/user/anaconda3/lib/python3.6/config-3.6m-darwin était un chemin vers un dossier avec un nom très similaire à celui que je cherchais pour, sauf pour le "-darwin" à la fin du nom du dossier qui est probablement là parce que je suis sur une distribution de macOS (peut-être c'est pourquoi la commande python3.6-config --ldflags ne l'a pas trouvée? Je ne sais pas). Après cela, je viens d'ajouter -L/Users/user/anaconda3/lib/python3.6/config-3.6m-darwin au début de "Other Liker Flags" de Xcode et tout (presque) compilé très bien.

Je dis « presque » parce que je devais renommer le include au début de mon code de #include<Python/Python.h> à #include<Python.h> (peut-être parce qu'en utilisant le premier, je suis compris la valeur par défaut du système de distribution de Python tandis qu'avec la seconde I » m y compris l'Anaconda? Encore une fois, je ne sais pas).

De toute façon maintenant tout compile bien et donc j'ai pensé à partager comment je l'ai fait au cas où quelqu'un d'autre est dans la même situation.