Расширения Hdf5 и Python C: неопределенный символ: H5T_NATIVE_DOUBLE_g - PullRequest
0 голосов
/ 19 апреля 2020

Я работал над расширением C python, для которого мне нужна библиотека HDF5.

Я работаю в среде conda, используя python 3.7.4. Библиотека HDF5 доступна для скачивания здесь . Моя версия - это встроенная общая библиотека (hdf5-1.12.0- linux -centos7-x86_64-shared-production).

Я скачал, распаковал и переместил все файлы в каталог env/ моего проекта, назвав его hdf5_shared.

Мое расширение C на данный момент является довольно небольшим, но довольно длинным, код beein C, поэтому я выложу наименьший фрагмент, воспроизводящий ошибку, исключая части methodDef, moduleDef и PyMODINIT_FUNC кода.

static PyObject* myFunction(PyObject* self, PyObject* args){
    hid_t datatype_id;
    datatype_id = H5Tcopy(H5T_NATIVE_DOUBLE);
    return Py_BuildValue("s", "alive");
}

Затем у меня есть файл установки python, setup.py в том же каталоге со следующим кодом:

from distutils.core import setup, Extension
import os

hdf5_lib_path = os.path.join(os.getcwd(), '../../../env/hdf5_shared/include')

module = Extension(
    "batch_similarities",
    include_dirs = [hdf5_lib_path],
    #extra_compile_args=['-Wall -O0 -g'],
    sources = ["batch_similarities.c"]
)

setup(
    name = "batch_similarities",
    version = "1.0",
    description = "Computes similarities matrices in C",
    ext_modules = [module]
)

Я наконец-то собрал расширение, используя следующую команду:
python setup.py install

Что не дает ошибок.

Когда я пытаюсь выполнить сценарий python, используя мое расширение, я получаю следующую ошибку:

ImportError: somePath/env/lib/python3.7/site-packages/batch_similarities.cpython-37m-x86_64-linux-gnu.so: undefined symbol: H5T_NATIVE_DOUBLE_g

Я понятия не имею, что является причиной проблемы, оглядываясь вокруг, я нашел некоторые похожие посты ( здесь , здесь и здесь ). Кажется, все они упоминают о проблемах, связанных с компиляцией без специального флага H5_BUILT_AS_DYNAMIC_LIB, что приводит к невозможности использования библиотеки в качестве динамической c библиотеки.

Я попытался добавить определение макроса и кучу других вещей в мой файл setup.py следующим образом:

module = Extension(
    "batch_similarities",
    include_dirs = [hdf5_inc_path],
    define_macros=[('H5_BUILT_AS_DYNAMIC_LIB', True)],
    runtime_library_dirs = [hdf5_lib_path],
    library_dirs=[hdf5_lib_path],
    #extra_compile_args=['-Wall -O0 -g'],
    sources = ["batch_similarities.c"]
)

Но ни одна из вышеперечисленных комбинаций не помогла.

Я не достаточно опытен, чтобы понять это самостоятельно, поэтому любая помощь в том, как решить проблему, и любая ссылка на материал / темы, чтобы лучше понять проблему, приветствуются. Большое спасибо за чтение всего этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...