我试图将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;
};
和我的wrap python
#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= 并使用了噪音文件夹
答案 0 :(得分:0)
在python中导入内容,运行其他一些代码,在这种情况下,它会加载并执行一些C ++代码。
当你加载一个库(如.so
)或在linux中运行一个可执行文件时,它会在它所链接的所有共享对象中查找符号。在编译和链接可执行文件或库时,它会在列出的目录中检查链接时的所有符号,以查找这些共享对象。
但是还有另一个概念是这些共享对象的路径。当您对某些库有一些依赖关系时,不仅可以存储这些.so
文件的名称,而且它们的路径也可以存储在.so
或可执行文件中。它更像是查找依赖项而不是每个共享对象路径的路径列表。
您可以使用ldd
检查二进制文件的路径和库。
如果在编译期间由于某种原因找到了那些.so
文件,但是它们的路径没有添加到库/可执行文件中,那么在加载库或运行可执行文件时,您将收到错误能够找到一个符号。您可以在gcc
中使用此开关添加二进制文件的路径:
-Wl,-rpath,your_path
您可以看到更多信息here
我觉得这可能是你的问题,因为你只是在你的CMAKE中设置inlude_dir变量。
答案 1 :(得分:0)
当我没有确定适当的范围时,我遇到了类似的错误。看起来您要导入很多标题,只需再次检查。