8

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 ヘッダー バイナリをビルドしようとしました。この問題の原因は何ですか。これを修正する方法に関する推奨事項は驚くべきものであり、私はこれに何時間も費やしました.

4

1 に答える 1

15

このエラーは、おそらく間違った Python ライブラリへのリンクが原因です。拡張機能と Boost Python ライブラリが、モジュールのインポートに使用している Python インストールに対してリンクされていることを確認してください。

Linux では、リンクしたライブラリを確認できますldd。OS Xotool -Lでも同じことを行います。たとえば、

otool -L libpcap_ext.so
otool -L /path/to/libboost_python-mt.dylib

リンク先の Python ライブラリを一覧表示する必要があります。

CMake では、変数PYTHON_LIBRARYを使用して、使用する Python ライブラリを変更できます。例として、コマンドラインで次のように設定できます

cmake -DPYTHON_LIBRARY="/path/to/libpython2.7.dylib" source_dir

最後に、OS X で動的にリンクされたライブラリを変更する手っ取り早い (つまり、再コンパイルせずに) 方法は、install_name_tool -change.

于 2014-01-10T19:19:34.417 に答える