2013-08-28 85 views
0

我需要從C程序中的C++程序調用一些方法。如何解決這個錯誤「:(。文本+ 0x4d):未定義的引用'_imp___ZN10Management11OpenEm'」

但我只有一個共享庫(.dll)使用這些方法。

要做到這一點,首先在C中創建一個包裝器,以調用dll中的方法用於C程序。我注意到,我確定我使用extern "C"來聲明函數以避免名稱混亂。

但是,當編譯我有一系列的錯誤(在減少顯示),當連接壁的.o的:

g++ -o bonnie++ bonnie++.o bon_io.o bon_file.o bon_time.o semaphore.o sync.o thread.o bon_suid.o duration.o rand.o util.o utils.o super.o pcm_file.o inode.o iname.o dir.o pcm.o -lpthread -L./ -lSmart 
pcm.o:pcm.c:(.text+0x4d): undefined reference to `_imp___ZN10Management11OpenEm' 
pcm.o:pcm.c:(.text+0x64): undefined reference to `_imp___ZN10Management12CloseEm' 
pcm.o:pcm.c:(.text+0x73): undefined reference to `_imp___ZN10Management17EnumerateEv' 
pcm.o:pcm.c:(.text+0xb9): undefined reference to `_imp___ZN18DemonstratorDevC1Ev' 
pcm.o:pcm.c:(.text+0xf7): undefined reference to `_imp___ZN18DemonstratorDevD1Ev' 
pcm.o:pcm.c:(.text+0x121): undefined reference to `_imp___ZN18DemonstratorDevice11OpenEi' 
pcm.o:pcm.c:(.text+0x138): undefined reference to `_imp___ZN18DemonstratorDev12CloseAdapterEv' 
pcm.o:pcm.c:(.text+0x15f): undefined reference to `_imp___ZN18DemonstratorDev23ConfigureClockFrequencyEi15_ClockFrequency' 
pcm.o:pcm.c:(.text+0x176): undefined reference to `_imp___ZN18DemonstratorDev21AdaptationBlockEnableEv' 
pcm.o:pcm.c:(.text+0x1a1): undefined reference to `_imp___ZN18CommandsManagementC1ER18DemonstratorDev' 
pcm.o:pcm.c:(.text+0x1df): undefined reference to `_imp___ZN18CommandsManagementD1Ev' 
pcm.o:pcm.c:(.text+0x21a): undefined reference to `_imp___ZN18CommandsManagement20DeviceInitializationEim9TimerCtrl' 
pcm.o:pcm.c:(.text+0x253): undefined reference to `_imp___ZN18CommandsManagement24EnableEmbeddedOperationsER8OWStatusim9TimerCtrl' 
pcm.o:pcm.c:(.text+0x290): undefined reference to `_imp___ZN18CommandsManagement12RegionUnlockEmmim9TimerCtrl' 
pcm.o:pcm.c:(.text+0x2da): undefined reference to `_imp___ZN18CommandsManagement17BufferedOverwriteEmmPKhiiim9TimerCtrl' 
pcm.o:pcm.c:(.text+0x32c): undefined reference to `_imp___ZN18CommandsManagement9BurstReadEmPtmih9BurstTypeim9TimerCtrl' 
/usr/lib/gcc/i686-pc-cygwin/4.7.3/../../../../i686-pc-cygwin/bin/ld: pcm.o: bad reloc address 0x20 in section `.eh_frame$_ZN10ManagementC1Ev' 
collect2: error: ld returned 1 exit status 
Makefile:37: recipe for target `bonnie++' failed 
make: *** [bonnie++] Error 1 

有人知道我做錯了什麼?

+2

在什麼目標文件中定義了「管理」? – jxh

+0

「管理」(和'DemonstratorDev','CommandsManagement')在共享庫('Smart.dll')中定義。 我用'-L./ -lSmart'將所有的對象文件與共享庫鏈接起來。我正在做正確的鏈接? - – user2088221

回答

1

你是否在包裝方法源文件中包含了extern「C」函數聲明頭文件?如果沒有,則會發生此錯誤

+0

是的,我包括頭文件在我的包裝(pcm.c)。我真的不明白爲什麼會出現這些錯誤... – user2088221

+0

還有一件事,所有'未定義的引用'定義在共享庫中'dll')。這個問題可能會發生,因爲我在「pcm.o」和「smart.dll」之間做了錯誤的連接? – user2088221

+1

明白了。您應該添加** pcm_share_library_adapter.cc **和** pcm_share_library_adapter.h **,然後在** pcm_share_library_adapter.cc **中添加'extern「C」someApiMethodAdapter(parameter);'並添加'someApiMethodAdapter(parameter){return someApiMethod(parameter);}'在** pcm_share_library_adapter.cc **中,所有代碼應該調用'someApiMethodAdapter不直接直接調用sharelibary方法 –

相關問題