2010-06-22 4 views
1

J'ai compilé une bibliothèque en utilisant cmake add_library (object3d SHARED un_fichier.h un_fichier.cpp).Charger une bibliothèque .so dans ctypes

Après la compilation, je reçois un fichier: libobject3d.so

Je voudrais appeler une fonction dans cette bibliothèque. Cette définition de la fonction dans some_file.h est:

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

J'ai vérifié que cette méthode existe dans ma bibliothèque en faisant:

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 [email protected]@GLIBCXX_3.4 
       U [email protected]@GLIBCXX_3.4 
0000000000202070 b _ZStL8__ioinit 
       U [email protected]@GLIBCXX_3.4 
       U [email protected]@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 [email protected]@GLIBC_2.2.5 
       w [email protected]@GLIBC_2.2.5 
0000000000000d30 t __do_global_ctors_aux 
0000000000000b30 t __do_global_dtors_aux 
0000000000202050 d __dso_handle 
       w __gmon_start__ 
       U [email protected]@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 [email protected]@GLIBC_2.2.5 

Cependant, lorsque je tente de charger cette bibliothèque dans ctypes:

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

Cet objet lib ne possède pas l'objet ComputeGeometryImage. C'est lib.ComputeGeometryImage n'existe pas.

Est-ce un problème de compilation de ma bibliothèque? Comment puis-je exposer cette méthode de C++ en ctypes?

Répondre

4

Votre compilateur C++ remplace le nom de la fonction par _Z20ComputeGeometryImagePciPf. Vous devez indiquer à votre compilateur d'arrêter de modifier le nom de la fonction. En some_file.h:

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

Vous pouvez également déclarer plusieurs fonctions pour avoir aucun nom mutilées avec un bloc:

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

Si vous avez besoin d'exposer les classes de C++ je recommanderai Boost.Python.

+0

Merci. Cela résout le problème. Je veux utiliser Boost.Python mais je veux aussi passer des tableaux numpy à ma classe/fonctions. Je n'ai pas trouvé un moyen de passer mon tableau numpy à une fonction C++. Peut-être avez-vous une suggestion? Comme vous le remarquerez, la sortie du paramètre (float *) sera donnée en utilisant les fonctions ctypes de la classe de tableau numpy. Si je peux faire quelque chose de similaire dans Boost, ma vie sera bien meilleure. –

+0

Je n'ai pas utilisé numpy donc je ne peux pas vraiment dire. En utilisant Boost.Python, vous pouvez avoir des méthodes C++ acceptant les objets Python. Voir boost :: python :: object. – Arlaharen

Questions connexes