2014-03-31 48 views
0

我不知道有很多關於在C中鏈接的信息,而且我遇到了一個問題。我的代碼是Python,但我試圖在C中使用庫(特別是libnfc)。我的Python代碼調用從IOLib.py一個功能,它看起來像這樣:使用python的c庫(未定義的參考)

from ctypes import cdll 
    lib = cdll.LoadLibrary('./jk4Lib.so') 

    def getRFID(): 
     return lib.NFCPollWrapper() 

jk4Lib.so是在同一文件夾的共享庫,從交流程序編譯

jk4RFIDPoll.c:

#include "jk4RFIDPoll.h" 
    static void stop_polling(int sig){ 
     //code 
    } 

    extern int NFCPollWrapper() { 
     //code 
    } 

jk4RFIDPoll.h:

#ifdef HAVE_CONFIG_H 
    # include "config.h" 
    #endif // HAVE_CONFIG_H 

    #include "libnfc-1.7.0/include/nfc/nfc.h" 
    #include "libnfc-1.7.0/include/nfc/nfc-types.h" 

    #include "libnfc-1.7.0/utils/nfc-utils.h" 

libnfc-1.7.0是我的程序主目錄下的一個文件夾。 這是編譯以下行:

gcc -c -Wall -fpic jk4RFIDPoll.c 

    gcc -shared -o libjk4.so jk4RFIDPoll.o 

這一切編譯罰款,但後來當我運行的Python程序,我得到了一個未定義引用的所有函數調用jk4RFIDPoll.so。我知道函數在我包含的頭文件中,但我認爲它沒有正確地鏈接所有內容。

我猜我在編譯或其他方面做得不夠。操作系統是Debian的一個版本。我應該補充一點,我已經能夠在libnfc文件夾中運行示例程序。讓我知道是否有其他信息我應該提供。

回答

0

您收到未定義的引用,因爲動態鏈接器不知道如何解決它們。 對於這個工作,你必須將您的共享對象

gcc -shared -o libjk4.so jk4RFIDPoll.o -lnfc 
+0

我嘗試這樣做時添加必要的庫,它仍然給出了同樣不確定的參考。我通過使用'/ sbin/ldconfig -p'和libnfc.so來確認libnfc是我機器上的庫。我還將前兩個包括'#include '和'#include '改爲包含庫文件,而不是本地文件。 – user2014969

+0

再次嘗試後,它工作。不是100%確定發生了什麼變化,我想也許我必須將/ usr/local/lib添加到路徑中,然後再次編譯.so。謝謝! – user2014969

0

您可能沒有正確創建共享庫。嘗試是這樣的:

gcc -shared -Wl,-soname,libjk4.so.1 -o libjk4.so.1.0.1 jk4RFIDPoll.o 

編譯之後,在使用之前安裝的共享庫的某個地方(例如,在/ usr/local/lib目錄/)。如果您不使用ldconfig,那麼不要忘記更新您的LD_LIBRARY_PATH環境變量以包含安裝路徑。

有關如何在Linux上編譯和安裝共享庫的更多詳細信息,請參閱http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

從Python加載時,應該指定soname,而不是.so文件的實際路徑。