在 Python 3.6 中调用 C++ 扩展时导入错误“未定义符号:_ZNK9FastNoise8GetNoiseEff”

Posted

技术标签:

【中文标题】在 Python 3.6 中调用 C++ 扩展时导入错误“未定义符号:_ZNK9FastNoise8GetNoiseEff”【英文标题】:Import error "undefined symbol: _ZNK9FastNoise8GetNoiseEff" when calling C++ extension in Python 3.6 【发布时间】:2018-07-10 20:26:05 【问题描述】:

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

#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);

这是我的编译方式:

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 中导入它时,它给了我这个错误:

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

对于这个问题的任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

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

另一个选项可能是完全在标头内实现您的 FastNoise 对象。

【讨论】:

谢谢,当我编译这两个 .cpp 文件时,它部分工作。现在它给了我一个不同的错误:dynamic module does not define module export function (PyInit_NoiseModule) 但对于我所问的,你的回答成功了。

以上是关于在 Python 3.6 中调用 C++ 扩展时导入错误“未定义符号:_ZNK9FastNoise8GetNoiseEff”的主要内容,如果未能解决你的问题,请参考以下文章

[ZT]C++ 扩展和嵌入 Python

C++程序调用python3

从 C++ 应用程序中的嵌入式 Python 调用时,多数组扩展库上的 Numpy 导入失败

boost::python - C++ 调用 Python 调用 C++

10 python 扩展

python中如何创建一个类 并且调用内部方法 3.6版本?