Я работал над расширением 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"]
)
Но ни одна из вышеперечисленных комбинаций не помогла.
Я не достаточно опытен, чтобы понять это самостоятельно, поэтому любая помощь в том, как решить проблему, и любая ссылка на материал / темы, чтобы лучше понять проблему, приветствуются. Большое спасибо за чтение всего этого.