Общая библиотека загружается как плагин во время выполнения моей основной программы с помощью API boost::dll::shared_library. т. е. моя основная программа не связана с плагином общей библиотеки.
Мой код работает на Ubuntu 20.04.
Я связываю свою общую библиотеку с Питон:
Код: Выделить всё
my_shared_lib/CMakeLists.txt:
find_package(Python3 COMPONENTS Development NumPy REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE ${Python3_LIBRARIES} Python3::NumPy)
Код: Выделить всё
#include
Py_Initialize();
namespace np = boost::python::numpy;
np::initialize(); //ImportError here
Ошибка импорта: /home/myuser/.local/lib/python3.8 /site-packages/numpy/core/_multiarray_umath.cpython-38-x86_64-linux-gnu.so: неопределенный символ: PyObject_SelfIter
Я проверил, что у меня есть /usr/lib/x86_64-linux-gnu/libpython3.8.so в моем LD_LIBRARY_PATH.При связывании моей основной программы с Python программа OK запускается без ошибки ImportError
Код: Выделить всё
main_program/CMakeLists.txt:
find_package(Python3 COMPONENTS Development NumPy REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE ${Python3_LIBRARIES} Python3::NumPy)
Если я вручную загружу libpython3.8.so в свою общую библиотеку следующим образом:
Код: Выделить всё
#include
#include
dlopen("/usr/lib/x86_64-linux-gnu/libpython3.8.so", RTLD_LAZY | RTLD_GLOBAL);
Py_Initialize();
namespace np = boost::python::numpy;
np::initialize();
Traceback (последний последний вызов):
Файл «/home/myuser/.local/lib/python3.8/site-packages/numpy/core/init.py», строка 23, в
из . импортировать несколько массивов
Файл "/home/myuser/.local/lib/python3.8/site-packages/numpy/core/multiarray.py", строка 10, в
из . переопределения импорта
Файл "/home/myuser/.local/lib/python3.8/site-packages/numpy/core/overrides.py", строка 6, в
из импорта numpy.core._multiarray_umath (
ImportError: PyCapsule_Import не удалось импортировать модуль «datetime»
Как сделать так, чтобы мой плагин общей библиотеки автоматически загружал libpython3.8.so при его загрузке?
ИЗМЕНИТЬ >
Используя gdb, я вижу, что мое первоначальное предположение было неверным. Когда основное приложение загружает мой плагин общей библиотеки, оно также загружает libpython3.8.so.1.0.
Загружено Загружено. '/home/myuser/.vs/mainapp/build/plugins/libap_python_detector.so'. Символы загружены.
Загружено '/usr/local/3rdparty/hpc/5.13.0-39_AMD_EPYC/boost176/build/lib/. libboost_numpy38.so.1.76.0' Символы загружены.
Загружено. '/lib/x86_64-linux-gnu/libpython3.8.so.1.0'. Символы загружены.
Загружено '/usr/local/3rdparty/hpc/5.13.0-39_AMD_EPYC/boost176/build/lib/libboost_python38. .so.1.76.0' Символы загружены.
Итак. что не так с загрузкой numpy?
Подробнее здесь: https://stackoverflow.com/questions/732 ... ed-library
Мобильная версия