gpt4 book ai didi

使用 numpy 和 gdal 的 Python C 扩展在运行时给出 undefined symbol

转载 作者:搜寻专家 更新时间:2023-10-31 02:17:59 24 4
gpt4 key购买 nike

我正在为 python 编写一个 C++ 扩展,以加速内部创建的光栅图像查看器。我有工作代码,但注意到速度并没有增加那么多,并且在更深入地分析之后意识到这是由于 gdal.ReadAsArray 调用,这是来自 C 扩展的 python 回调。为了在调用 python 对象时避免 Python C-API 的开销,我决定使用 gdal 的 C++ 库,而不是对现有 gdalDataset 使用 Python 回调。 (空间不是问题)。然而,在为此实现代码后,我在运行时遇到了错误(扩展编译正常)

这是

 import getRasterImage_new
ImportError: /local1/data/scratch/lib/python2.7/site-packages
/getRasterImage_new.so: undefined symbol: _ZN11GDALDataset14GetRasterYSizeEv

下面的代码复制了错误(可能需要一些编辑才能在您的机器上运行(忽略未初始化的变量,这正是复制错误所需要的)。

python :

#!/usr/bin/env python
import numpy
from osgeo import gdal
import PythonCTest

print("test starting")
PythonCTest.testFunction(1)
print("test complete")

C++:

#include "Python.h"
#include "numpy/arrayobject.h"
#include "gdal_priv.h"
#include <iostream>

extern "C"{
static PyObject* PythonCTest_testFunction(PyObject* args);
static PyMethodDef PythonCTest_newMethods[] = {
{"testFunction", (PyCFunction)PythonCTest_testFunction, METH_VARARGS,
"test function"},
{NULL,NULL,0,NULL}};

PyMODINIT_FUNC initPythonCTest(void){
(void)Py_InitModule("PythonCTest",PythonCTest_newMethods);
import_array();
}
}
GDALDataset* y;
static PyObject* PythonCTest_testFunction(PyObject* args){
std::cout << "in testFunction\n";
y->GetRasterYSize();
std::cout << "doing stuff" << "\n";
return Py_None;
}

我们非常欢迎任何建议。


编辑

您也可以删除 from osgeo import gdal 并发生错误(只是刚刚注意到)。


编辑 2

我忘了说我正在使用 distutils 编译我的扩展

当前的setup.py是

#!/usr/bin/env python
from distutils.core import setup, Extension
import os
os.environ["CC"] = "g++"
setup(name='PythonCTest', version='1.0', \
ext_modules=[Extension('PythonCTest', ['PythonCTest.cpp'],
extra_compile_args=['--std=c++14','-l/usr/include/gdal', '-I/usr/include/gdal'])])

最佳答案

Python 扩展模块是一个可动态加载(共享)的库。链接共享库时,您需要指定其库依赖项,例如 -lgdal 以及与此相关的 -lpython2.7。如果不这样做会导致库中包含未解析的符号,并且如果在加载时未提供这些符号,则加载将失败,如 Python 所报告的那样。

要解决该错误,您需要将 libraries=['gdal'] 添加到 Extension 构造函数中。在 extra_compile_args 中指定 -lgdal 将不起作用,因为顾名思义,编译参数用于编译而非链接。

请注意,在链接可执行文件时未检测到未解析的符号,构建将因链接器错误而失败。要在链接共享库时获得相同的诊断,请在链接参数中包含 -Wl,-zdefs

关于使用 numpy 和 gdal 的 Python C 扩展在运行时给出 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34998776/

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