我正在尝试将 c++ 代码包装到 python 中,只有一个类可以导出两个函数。我编译到 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);
};
噪声库从 http://sourceforge.net/projects/libnoise/files/libnoise%20sources/1.0.0/libnoisesrc-1.0.0.zip/download?use_mirror=garr&download=下载 并使用噪声文件夹