gpt4 book ai didi

c++ - 为 boost python 编译的 .so 找不到模块

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:47:51 25 4
gpt4 key购买 nike

我正在尝试将 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;
};

和我的包裹 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=和使用噪音文件夹

最佳答案

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

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

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

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

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

-Wl,-rpath,your_path

你可以看到更多信息here

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

关于c++ - 为 boost python 编译的 .so 找不到模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19936166/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com