Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 所以对于boost,python找不到模块_C++_Python_Boost_Boost Python - Fatal编程技术网

C++ 所以对于boost,python找不到模块

C++ 所以对于boost,python找不到模块,c++,python,boost,boost-python,C++,Python,Boost,Boost Python,我试图将C++代码包到Python中,只需用两个函数导出一个类。 我编译为to map.so,当我尝试导入map时,会得到类似噪声的错误 Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: ./map.so: undefined symbol: _ZTIN5noise6module6ModuleE 我的CMakeLists.txt看起来像 projec

我试图将C++代码包到Python中,只需用两个函数导出一个类。 我编译为to map.so,当我尝试导入map时,会得到类似噪声的错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: ./map.so: undefined symbol: _ZTIN5noise6module6ModuleE
我的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);
};
噪音资料库可从
并使用了噪声文件夹

导入Python中的某个东西,运行了一些其他代码,在这种情况下,它加载并执行了一些C++代码。 当您将库加载为.so或在linux中运行可执行文件时,它会在链接到的所有共享对象中查找符号。编译和链接可执行文件或库时,它会在链接时检查列出的目录中的所有符号,以查找这些共享对象

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

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

如果在编译过程中由于某种原因找到了这些.so文件,但没有将它们的路径添加到库/可执行文件中,则在加载库或运行可执行文件时,您将因找不到符号而出错。您可以在gcc中使用此开关向二进制文件添加路径:

-Wl,-rpath,your_path
你可以看到更多信息


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

我在没有确保正确的范围时遇到了类似的错误。看起来您正在导入大量的头,请再次检查。

c++filt说ZTIN5noise6module6ModuleE的类型信息已被损坏。对于noise::module::module,我猜您有一个虚拟函数。如果您包含模块类定义,我们可以给您一个明确的答案。@SamMiller我添加了代码,但里面没有虚拟函数。你能帮忙吗?libnoise库中的A表示它不是一个只包含标题的库。尝试更新CMakeLists.txt文件以链接libnoise库。我对CMake不太熟悉,但听起来@TannerSansbury建议在你的CMakeLists.txt文件的目标链接库列表中添加noise。您可能还需要将noise和/或noise/src添加到include_目录中。@TannerSansbury,cm2:您的人有什么问题,请使用注释作为注释,使用答案作为答案。请将您的答案作为答案发布。
-Wl,-rpath,your_path