2016-12-05 17 views
1

私はいくつかのPythonコードの中でC++で書かれた共有ライブラリを使用しようとしています。私はLinux OSの下にいる。Pythonで共有ライブラリをロードするときに未定義のシンボル

まず私は、次のコマンドを使用して共有ライブラリを作成します。

g++ -Wall -fPIC -O2 -c HeliosDacAPI.cpp 
g++ -shared -o libHeliosDacAPI.so HeliosDacAPI.o 

その後、私は試してみて、Pythonのコンソール内のこのライブラリをロードします。

>>> import ctypes 
>>> HeliosLib = ctypes.cdll.LoadLibrary("./libHeliosDacAPI.so") 

私はエラーを取得する:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python3.5/ctypes/__init__.py", line 425, in LoadLibrary 
    return self._dlltype(name) 
    File "/usr/lib/python3.5/ctypes/__init__.py", line 347, in __init__ 
    self._handle = _dlopen(self._name, mode) 
OSError: ./libHeliosDacAPI.so: undefined symbol: _ZN9HeliosDac18GetControlResponseEiPhi 

彼女私はこのような問題をデバッグする方法についていくつかのヒントを探しています

0000000000202088 B __bss_start 
0000000000202088 b completed.7585 
       w [email protected]@GLIBC_2.2.5 
0000000000202090 B dacController 
0000000000000cb0 t deregister_tm_clones 
0000000000000d40 t __do_global_dtors_aux 
0000000000201dd8 t __do_global_dtors_aux_fini_array_entry 
0000000000202078 d __dso_handle 
0000000000202080 d DW.ref.__gxx_personality_v0 
0000000000201de8 d _DYNAMIC 
0000000000202088 D _edata 
00000000002020a0 B _end 
00000000000014b8 T _fini 
0000000000000d80 t frame_dummy 
0000000000201dd0 t __frame_dummy_init_array_entry 
0000000000001758 r __FRAME_END__ 
0000000000202000 d _GLOBAL_OFFSET_TABLE_ 
       w __gmon_start__ 
00000000000014dc r __GNU_EH_FRAME_HDR 
       U [email protected]@CXXABI_1.3 
0000000000000bb0 T _init 
0000000000202098 B inited 
       w _ITM_deregisterTMCloneTable 
       w _ITM_registerTMCloneTable 
0000000000201de0 d __JCR_END__ 
0000000000201de0 d __JCR_LIST__ 
       w _Jv_RegisterClasses 
       U [email protected]@GLIBC_2.3.4 
0000000000000cf0 t register_tm_clones 
       U [email protected]@GLIBC_2.4 
0000000000202088 d __TMC_END__ 
       U [email protected]@GCC_3.0 
00000000000T _Z10SetShutterib 
0000000000000db0 T _Z10WriteFrameiihP11HeliosPointi 
0000000000001420 T _Z11OpenDevicesv 
00000000000013d0 T _Z12CloseDevicesv 
0000000000001360 T _Z13EraseFirmwarei 
0000000000001290 T _Z18GetFirmwareVersioni 
0000000000000f20 T _Z4Stopi 
0000000000000f90 T _Z7GetNameiPc 
00000000000010c0 T _Z7SetNameiPc 
0000000000001150 T _Z9GetStatusi 
       U [email protected]@GLIBCXX_3.4 
       U _ZN9HeliosDac11OpenDevicesEv 
       U _ZN9HeliosDac11SendControlEiPhi 
       U _ZN9HeliosDac18GetControlResponseEiPhi 
       U _ZN9HeliosDac9SendFrameEiPhi 
       U _ZN9HeliosDacC1Ev 
       U _ZN9HeliosDacD1Ev 
       U [email protected]@GLIBCXX_3.4 

:eはHeliosDacAPI.h

nm libHeliosDacAPI.soを示しています。

+0

'nm libHeliosDacAPI.so'とは何ですか? 'HeliosDacAPI.h'ファイルを見ることができますか? – YSC

答えて

1

私は確信が持てませんが、HeliosDac::GetControlResponse(int, ?*, int)HeliosDac.cppで定義されており、多くをコンパイルしてlibHeliosDacAPI.soにリンクしています。行為で

nm libHeliosDacAPI.soから我々は明確に(これはあなたの問題のpythonからライブラリをロードするためにあなたの方法から来ていないことを意味します)、このシンボルが使用されるが、Uがndefinedされていることを参照してください。

    U _ZN9HeliosDac18GetControlResponseEiPhi 

あなたは可能性がありコンパイルしようとする:

g++ -Wall -fPIC -O2 -c HeliosDacAPI.cpp 
g++ -Wall -fPIC -O2 -c HeliosDac.cpp 
g++ -shared -o libHeliosDacAPI.so HeliosDacAPI.o HeliosDac.o 
+0

私は自分のエラーを解決しましたが、別のエラーが発生しました:OSError:./libHeliosDacAPI.so:未定義のシンボル:libusb_close。 HeliosDACリポジトリのファイルでlibusb_close関数を見つけ、そこから.oファイルを作成して、3つのファイルすべてから共有ライブラリを作成する必要がありますか? – trojek

+1

'g ++ -lusb -shared -o libHeliosDacAPI.so HeliosDacAPI.o HeliosDac.o' – YSC

+0

これは役に立ちませんでした。あなたのヒントの前に:sudo ln -s /usr/lib/x86_64-linux-gnu/libusb-1.0.so /usr/lib/libusb.so – trojek

関連する問題