Загрузите библиотеку .so в ctypes

1

Я собрал библиотеку, используя cmake add_library (object3d SHARED some_file.h some_file.cpp).

После компиляции я получаю файл: libobject3d.so

Я хотел бы вызвать функцию в этой библиотеке. Это определение функции в файле some_file.h:

void ComputeGeometryImage(char * input_image, int geometry_image_size, float * output);

Я проверил, что этот метод существует в моей библиотеке, выполнив:

nm libobject3d.so
0000000000202058 d DW.ref.__gxx_personality_v0
0000000000201d40 a _DYNAMIC
0000000000201fe8 a _GLOBAL_OFFSET_TABLE_
0000000000000cbd t _GLOBAL__I_export_object3d_lib.cpp
                 w _Jv_RegisterClasses
0000000000000bdc T _Z20ComputeGeometryImagePciPf
0000000000000c75 t _Z41__static_initialization_and_destruction_0ii
                 U _Z7load_3dPKci
0000000000000cd2 W _ZN7Image2DIfE10get_accessEv
0000000000000ce8 W _ZN7Image2DIfED1Ev
                 U _ZNK8Object3D18convert_to_Image2DEi
                 U _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
                 U _ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4
0000000000202070 b _ZStL8__ioinit
                 U _ZdaPv@@GLIBCXX_3.4
                 U _ZdlPv@@GLIBCXX_3.4
0000000000201d20 d __CTOR_END__
0000000000201d10 d __CTOR_LIST__
0000000000201d30 d __DTOR_END__
0000000000201d28 d __DTOR_LIST__
0000000000000e70 r __FRAME_END__
0000000000201d38 d __JCR_END__
0000000000201d38 d __JCR_LIST__
0000000000202060 A __bss_start
                 U __cxa_atexit@@GLIBC_2.2.5
                 w __cxa_finalize@@GLIBC_2.2.5
0000000000000d30 t __do_global_ctors_aux
0000000000000b30 t __do_global_dtors_aux
0000000000202050 d __dso_handle
                 w __gmon_start__
                 U __gxx_personality_v0@@CXXABI_1.3
0000000000202060 A _edata
0000000000202078 A _end
0000000000000d68 T _fini
0000000000000a40 T _init
0000000000000b10 t call_gmon_start
0000000000202060 b completed.7382
0000000000202068 b dtor_idx.7384
0000000000000bb0 t frame_dummy
                 U memcpy@@GLIBC_2.2.5

Однако, когда я пытаюсь загрузить эту библиотеку в ctypes:

lib = np.ctypeslib.load_library('libobject3d.so', '.')

Этот объект lib не имеет объекта ComputeGeometryImage. Это lib.ComputeGeometryImage не существует.

Это проблема компиляции моей библиотеки? Как вывести этот метод из С++ в ctypes?

Теги:
ctypes

1 ответ

4
Лучший ответ

Ваш компилятор С++ управляет именем функции _Z20ComputeGeometryImagePciPf. Вы должны сообщить своему компилятору, чтобы остановить изменение имени функции. В файле some_file.h:

extern "C" void ComputeGeometryImage(char * input_image, 
                                     int geometry_image_size, 
                                     float * output);

Вы также можете объявить несколько функций, чтобы не иметь ни одного искаженного имени с блоком:

extern "C"
{
    void foo(int i);
    void bar(char c);
}

Если вам нужно выставить классы из С++, я бы рекомендовал Boost.Python.

  • 0
    Спасибо. Это решает проблему. Я хочу использовать Boost.Python, но я также хочу передать массивы в мой класс / функции. Я не нашел способ передать мой массив в функцию C ++. Возможно, у вас есть предложение? Как вы заметили, вывод параметра (float *) будет предоставлен с использованием функций ctypes класса numpy array. Если я смогу сделать что-то подобное в Boost, моя жизнь станет намного лучше.
  • 0
    Я не использовал NumPy, поэтому я не могу сказать. Используя Boost.Python, вы можете иметь методы C ++, принимающие объекты Python. Смотрите boost :: python :: object.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню