Python バインディングを記述したい C++ コードがたくさんあります。これを機能させる最も簡単な方法と思われるため、Boost.Python を使用しようとしていますが、連携していません。ビルドしようとしている拡張モジュールのコードの一部を次に示します。
BOOST_PYTHON_MODULE(libpcap_ext) {
using namespace boost::python;
class_<PacketEngine>("PacketEngine")
.def("getAvailableDevices", &PacketEngine_getAvailableDevices);
}
Bjam は苦痛のようで、私の Pythonpath を認識しないか、libpcap とのリンクを許可しないため、CMake を使用しています。これは私のCMakeListsファイルで、すべてを正常にインポートしてビルドできます(期待どおりにlibpcap.soを出力します):
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
IF(NOT CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE "DEBUG")
#SET(CMAKE_BUILD_TYPE "RELEASE")
#SET(CMAKE_BUILD_TYPE "RELWITHDEBINFO")
#SET(CMAKE_BUILD_TYPE "MINSIZEREL")
ENDIF()
FIND_PACKAGE(Boost 1.55.0)
find_package(PythonLibs REQUIRED)
IF(Boost_FOUND)
INCLUDE_DIRECTORIES("${Boost_INCLUDE_DIRS}" "${PYTHON_INCLUDE_DIRS}")
SET(Boost_USE_STATIC_LIBS OFF)
SET(Boost_USE_MULTITHREADED ON)
SET(Boost_USE_STATIC_RUNTIME OFF)
FIND_PACKAGE(Boost 1.55.0 COMPONENTS python)
ADD_LIBRARY(pcap_ext MODULE PacketWarrior/pcap_ext.cc PacketWarrior/PacketEngine.h PacketWarrior/PacketEngine.cc PacketWarrior/Packet.h PacketWarrior/Packet.cc)
TARGET_LINK_LIBRARIES(pcap_ext pcap)
TARGET_LINK_LIBRARIES(pcap_ext ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})
ELSEIF(NOT Boost_FOUND)
MESSAGE(FATAL_ERROR "Unable to find correct Boost version. Did you set BOOST_ROOT?")
ENDIF()
ADD_DEFINITIONS("-Wall")
そして、モジュールを利用しようとする私の pcap.py ファイル:
import libpcap_ext
engine = libpcap_ext.PacketEngine()
print engine.getAvailableDevices()
しかし、モジュールを実行しようとすると、次のエラーが発生します。
Traceback (most recent call last):
File "../pcap.py", line 2, in <module>
engine = libpcap_ext.PacketEngine()
TypeError: __init__() should return None, not 'NoneType
Boost.Python が Python 3 を使用しようとしており、システムのデフォルトが Python 2.7.3 であるためだと思います。user-config.jam ファイル (boost_1_55_0 ディレクトリ内) を Python 2.7 を指すように変更して、ビルドを試みました。
# Configure specific Python version.
# using python : 2.7 : /usr/bin/python2.7 : /usr/include/python2.7 : /usr/lib ;
Boost.Python のインストール手順 [0] は、bjam でクイックスタートをビルドしようとすると失敗するようです (多くの警告)。そのため、Boost Getting Started 手順 [1] に従って Python ヘッダー バイナリをビルドしようとしました。この問題の原因は何ですか。これを修正する方法に関する推奨事項は驚くべきものであり、私はこれに何時間も費やしました.