6

C++コードをpythonにラップしようとしています.2つの関数でエクスポートするクラスは1つだけです。map.so にコンパイルして、import map ノイズのようなエラーを取得しようとすると

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ./map.so: undefined symbol: _ZTIN5noise6module6ModuleE

私のC ++ディレクトリは次のようになります(ノイズはダウンロードされたソースコードであり、すべてのコードはsrc内にあります)

/ map.cpp
  real_map.h
  real_map.cpp
  noise/
       src/
          .h and .cpp and new directory

私のCMakeLists.txtは次のようになります

project (map)
cmake_minimum_required(VERSION 2.8)

find_package(PythonLibs)
include_directories (${PYTHON_INCLUDE_DIRS})

find_package(Boost 1.45.0 COMPONENTS python)
include_directories (${Boost_INCLUDE_DIRS})


add_library (
    map SHARED  
    WrappedMediumMapTile.cpp
)

target_link_libraries (medium_map
    boost_python
    ${PYTHON_LIBRARIES}
    ${Boost_LIBRARIES}
)

誰が何が問題なのか手がかりを持っていますか?

ラップしたい .cpp クラス

#include <list>
#include <iostream>
#include <vector>
#include <utility>
#include <map>

#include "noise/src/noise.h"
#include "noiseutils/noiseutils.h"

class MapTile
{
public:
    MapTile(float x1, float y1, float x2, float y2);
    ~MapTile();
    void genHeightMaps(int resX, int resY);


    bool isPassable(float x, float y);
    bool isBuildable(float x, float y);


protected:
    float parentX1;
    float parentY1;
    float parentX2;
    float parentY2;

private:
    noise::module::RidgedMulti baseMountainTerrain;
    noise::module::ScaleBias mountainTerrain;
    noise::module::Billow baseFlatTerrain;
    noise::module::ScaleBias flatTerrain;
    noise::module::Perlin lowFreqBaseTerrainType;
    noise::module::Perlin mediumFreqBaseTerrainType;
    noise::module::Perlin highFreqBaseTerrainType;
    noise::module::Select baseTerrainType;
    noise::module::ScaleBias terrainType;
    noise::module::Const zero;
    noise::module::Perlin highHigh;
    noise::module::Select finalTerrain;
    noise::module::Select goldWoodDeposits;
    noise::utils::NoiseMap heightMapTerrain;
    noise::utils::NoiseMap heightMapGoldWood;
    noise::utils::Image image;
};

そして私のラップパイソン

#include <boost/python.hpp>

#include "MapTile.h"
#include "noise/src/noise.h"
#include "noiseutils/noiseutils.h"

using namespace boost::python;

BOOST_PYTHON_MODULE(map) // module name
{
     class_<MapTile>("MapTile", init<float, float, float, float>())
        .def("isPassable", &MapTile::isPassable)
        .def("isBuildable", &MapTile::isBuildable);
};

Noise ライブラリは http://sourceforge.net/projects/libnoise/files/libnoise%20sources/1.0.0/libnoisesrc-1.0.0.zip/download?use_mirror=garr&download=からダウンロードし、 ノイズ フォルダを使用します。

4

2 に答える 2

0

Python で何かをインポートすると、他のコードが実行されます。この場合は、C++ コードを読み込んで実行しています。

ライブラリを ( として.so) ロードするか、Linux で実行可能ファイルを実行すると、リンク先のすべての共有オブジェクトでシンボルが検索されます。実行可能ファイルまたはライブラリがコンパイルおよびリンクされている場合、リンク中に、それらの共有オブジェクトを探すためにリストされているディレクトリ内のすべてのシンボルがチェックされます。

しかし、それらの共有オブジェクトのパスである別の概念もあります。一部のライブラリへの依存関係がある場合、それらのファイルの名前だけでなく、それらへのパスも、または実行可能ファイル.soに保存できます。.soこれは、共有オブジェクトごとのパスではなく、依存関係を探すためのパスのリストに似ています。

を使用して、バイナリのパスとライブラリを確認できますldd

何らかの理由でコンパイル中にこれらの.soファイルが見つかったが、それらへのパスがライブラリ/実行可能ファイルに追加されていない場合、ライブラリのロード中または実行可能ファイルの実行中に、シンボルが見つからないというエラーが発生します。このスイッチを使用gccして、バイナリへのパスを追加できます。

-Wl,-rpath,your_path

そして、あなたはここでより多くの情報を見ることができます

CMAKE で inlude_dir 変数のみを設定しているため、これが問題であると思われます。

于 2014-01-13T09:06:21.523 に答える
0

適切なスコープを確保していなかったときに、同様のエラーが発生しました。大量のヘッダーをインポートしているようです。もう一度確認してください。

于 2014-07-04T12:09:33.590 に答える