Als ich es mit Homebrew einführte, um [Boost.python] auszuprobieren (http://www.boost.org/doc/libs/1_60_0/libs/python/doc/html/index.html), war ich ein wenig süchtig danach. Ich werde es notieren.
Rufen wir eine Funktion auf, die das Quadrat von c ++ aus Python zurückgibt.
hello_ext.cpp
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
int square(int a)
{
return a*a;
}
BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("square",square);
}
Makefile zum Erstellen von hello_ext.so.
all: hello_ext.so
CC = g++
FRAMEWORK_PATH=/usr/local/opt/python/Frameworks
INCLUDE_PATH=$(FRAMEWORK_PATH)/Python.framework/Versions/2.7/include/python2.7
hello_ext.o: hello_ext.cpp
$(CC) -Wall -O2 -fPIC -c $< -I$(INCLUDE_PATH)
hello_ext.so: hello_ext.o
$(CC) -shared -o $@ $< -lboost_python -F$(FRAMEWORK_PATH) -framework Python
Der Anrufer von Python.
hello.py
#!/usr/bin/env python
import hello_ext
print hello_ext.square(2)
Build- und Ausführungsergebnisse.
$ make
g++ -shared -o hello_ext.so -I/usr/local/opt/python/Frameworks/Python.framework/Versions/2.7/include/python2.7 hello_ext.o -lboost_python -F/usr/local/opt/python/Frameworks -framework Python
$ python hello.py
4
Nun, der Code sollte sauberer sein als die altmodischen Python-Erweiterungen.
Wenn Sie Objective-C mischen möchten, weil Sie ein vorhandenes Framework verwenden möchten, sollten Sie Objective-C ++ verwenden. Erstellen Sie Folgendes als hello_ext.mm.
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#import <Foundation/Foundation.h>
int square(int a)
{
return a*a;
}
void nslog(void)
{
NSLog(@"Hello");
}
BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("square",square);
def("nslog",nslog);
}
Das Makefile ist unten. Fügen Sie beim Kompilieren -x Objective-C ++ und beim Verknüpfen den Framework-Pfad und den Framework-Namen hinzu.
all: hello_ext.so
CC =clang++
FRAMEWORK_PATH=/usr/local/opt/python/Frameworks
INCLUDE_PATH=$(FRAMEWORK_PATH)/Python.framework/Versions/2.7/include/python2.7
FRAMEWORK_PATH2=/System/Library/Frameworks
STD_CPP_PATH = /usr/include/c++/4.2.1/
FRAMEWORK_OPTIONS=-F$(FRAMEWORK_PATH) -framework Python -F$(FRAMEWORK_PATH2) -framework Foundation
hello_ext.o: hello_ext.mm
$(CC) -x objective-c++ -Wall -O2 -fPIC -c $< -I$(INCLUDE_PATH) -I$(STD_CPP_PATH)
hello_ext.so: hello_ext.o
$(CC) -shared -o $@ $< -lboost_python $(FRAMEWORK_OPTIONS)
.PHONY: clean
clean:
rm *.so *.o
Sie können es unten nennen.
import hello_ext
hello_ext.nslog()
print hello_ext.square(2)
Das Ausführungsergebnis ist wie folgt.
2017-04-09 11:45:29.818 Python[7710:333116] Hello
4
Zunächst heißt es im Offiziellen Tutorial, dass Sie bjam verwenden können. Sie können bjam installieren, indem Sie den Boost-Build von Homebrew installieren. Ich wurde jedoch gebeten, den Pfad von Jamfile usw. anzugeben. Daher gab ich auf, weil ich nicht wusste, wo ich Homebrew installieren sollte.
Als nächstes habe ich versucht, mit g ++ zu bauen, indem ich von meinen Vorgängern wie Ich werde kurz die Funktionen von Boost.Python vorstellen gelernt habe. Aber als ich versuchte, das Argument zu übergeben
Segmentation fault: 11
Aber
Fatal Python error: PyEval_SaveThread: NULL tstate
Es war schrecklich, das zu sagen.
Die letztere Fehlermeldung blieb in der Suche und im StackOverflow-Artikel hängen ) Ist gekommen.
Meistens werden mehrere Python-Versionen gemischt, oder? Wenn Sie sich die Abhängigkeiten mit otool -L oder so ansehen;)
Der Kommentar ist genau Bingo. Sicherlich gab es eine Mischung aus nativen OSX-Pfaden und Homebrew-Pfaden.
Also habe ich es gelöst, indem ich den Framework-Pfad durch den Homebrew-Pfad anstelle des nativen OSX-Pfads durch die Option -F ersetzt habe.
Ich kam mit man ld zur Option -F. Ich schäme mich zu sagen, dass ich die Option -framework nicht einmal verstehe. Ich habe nicht genug gelernt, aber ich habe es geschafft.
Recommended Posts