C++ 所以对于boost,python找不到模块
我试图将C++代码包到Python中,只需用两个函数导出一个类。 我编译为to map.so,当我尝试导入map时,会得到类似噪声的错误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
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