memoryfolder

メモです

Cのコードをpythonで使う

extensionというそうです
Can we use C code in Python? - Stack Overflow
1. Extending Python with C or C++ — Python 2.7.13 documentation

Machello worldをやろうとすると結構詰まったので以下回避策のメモ。
まず、チュートリアルに従ってhello.cppとMakefileを作りました。

hello.cpp

char const* greet()
{
   return "hello, world";
}
 
#include <boost/python.hpp>
 
BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

Makefile

# location of the Python header files
 
PYTHON_VERSION = 2.7
PYTHON_INCLUDE = /usr/include/python$(PYTHON_VERSION)
 
# location of the Boost Python include files and library
 
BOOST_INC = /usr/include
BOOST_LIB = /usr/lib
 
# compile mesh classes
TARGET = hello_ext
 
$(TARGET).so: $(TARGET).o
	g++ -shared -Wl,--export-dynamic $(TARGET).o -L$(BOOST_LIB) -lboost_python-$(PYTHON_VERSION) -L/usr/lib/python$(PYTHON_VERSION)/config -lpython$(PYTHON_VERSION) -o $(TARGET).so
 
$(TARGET).o: $(TARGET).C
	g++ -I$(PYTHON_INCLUDE) -I$(BOOST_INC) -fPIC -c $(TARGET).C


これでmakeコマンドを打つも

hello.CPP:6:10: fatal error: 'boost/python.hpp' file not found

finderで探すとこれは僕の環境では/usr/local/includeにあったので、PYTHON_INCLUEをこのパスに変えることで回避。

/usr/local/include/boost/python/detail/wrap_python.hpp:50:11: fatal error: 'pyconfig.h' file not found

pyconfig.hを探すもなかなか見つからない。よくわからないところにあった。とりあえずPYTHON_INCLUDE2ということで指定。
/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/include/python2.7

次は

unknown option: --export-dynamic

このオプション、macではとりあえず消しとくといいらしい(ちゃんとした解決法もあるけど)。

そして

library not found for -lboost_python-2.7

これがわからない。ちょっとg++こまんどの勉強してきます