编译.so for boost python无法找到模块

时间:2013-11-12 17:40:21

标签: c++ python boost boost-python

我试图将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= 并使用了噪音文件夹

2 个答案:

答案 0 :(得分:0)

在python中导入内容,运行其他一些代码,在这种情况下,它会加载并执行一些C ++代码。

当你加载一个库(如.so)或在linux中运行一个可执行文件时,它会在它所链接的所有共享对象中查找符号。在编译和链接可执行文件或库时,它会在列出的目录中检查链接时的所有符号,以查找这些共享对象。

但是还有另一个概念是这些共享对象的路径。当您对某些库有一些依赖关系时,不仅可以存储这些.so文件的名称,而且它们的路径也可以存储在.so或可执行文件中。它更像是查找依赖项而不是每个共享对象路径的路径列表。

您可以使用ldd检查二进制文件的路径和库。

如果在编译期间由于某种原因找到了那些.so文件,但是它们的路径没有添加到库/可执行文件中,那么在加载库或运行可执行文件时,您将收到错误能够找到一个符号。您可以在gcc中使用此开关添加二进制文件的路径:

-Wl,-rpath,your_path

您可以看到更多信息here

我觉得这可能是你的问题,因为你只是在你的CMAKE中设置inlude_dir变量。

答案 1 :(得分:0)

当我没有确定适当的范围时,我遇到了类似的错误。看起来您要导入很多标题,只需再次检查。