首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Python3.6中调用C++扩展时出现导入错误"undefined symbol:_ZNK9FastNoise8GetNoiseEff“

在Python3.6中调用C++扩展时出现导入错误"undefined symbol:_ZNK9FastNoise8GetNoiseEff“
EN

Stack Overflow用户
提问于 2018-07-11 04:26:05
回答 1查看 3.2K关注 0票数 1

我目前正在尝试为python脚本做一些C++扩展。在python方面,它似乎编译得很好,它生成了我的.so共享库,但是当我在我的python脚本中调用它时,它会引发一个未定义符号的错误。当前代码如下:

代码语言:javascript
复制
#include <iostream>
#include "FastNoise.h"
#include <string>
#include <time.h>

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>

#include <boost/python/def.hpp>
#include <boost/python/module.hpp>

using namespace std;
using namespace cv;
namespace bp = boost::python;

int gen(int _size)
{
    FastNoise myNoise;
    myNoise.SetNoiseType(FastNoise::Simplex);
    myNoise.SetSeed((int)(rand() * time(NULL)));

    Size img_size(_size, _size);
    Mat noise_map(img_size, CV_32FC3);

    for (int y = 0; y < _size; y++) {
        for (int x = 0; x < _size; x++) {
            Vec3f &color = noise_map.at<Vec3f>(Point(x, y));
            color.val[0] = (myNoise.GetNoise(x, y) + 1) / 2;
            color.val[1] = (myNoise.GetNoise(x, y) + 1) / 2;
            color.val[2] = (myNoise.GetNoise(x, y) + 1) / 2;
        }
    }

    imshow("test", noise_map);
    waitKey(0);
    return 0;
}

BOOST_PYTHON_MODULE(gen) {
    bp::def("gen", gen);
}

下面是我如何编译它的:

代码语言:javascript
复制
g++ main.cpp -I/opt/opencv/include/opencv -I/usr/include/python3.6m -I/usr/local/include/boost -L/opt/opencv/release/lib -L/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu -L/usr/local/lib -lopencv_core -lopencv_highgui -lopencv_imgcodecs -lpython3.6m -lboost_python36 -o NoiseModule.so -shared -fPI

当我在python中导入它时,它会给我这个错误:

代码语言:javascript
复制
>>> import NoiseModule
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /home/matheus/PycharmProjects/TerrainGenerator/NoiseGenerator/NoiseModule.so: undefined symbol: _ZNK9FastNoise8GetNoiseEff
>>> 

在这个问题上任何形式的帮助都将是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-11 04:56:39

您的共享对象并不能访问您使用的所有函数。您可能有一个实现FastNoise对象的像FastNoise.cpp这样的文件。但是,您只能使用main.cpp来编译动态库(.so)文件。因此,请确保所有.cpp文件都包含在python c++扩展的构建中。

另一种选择可能是在标头中完全实现FastNoise对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51273418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档