使用python中的c库(未定义的引用)

时间:2014-03-31 22:00:21

标签: python c linker

我对C中的链接知之甚少,而且我遇到了问题。我的代码是在Python中,但我试图在C中使用库(特别是libnfc)。我的python代码从IOLib.py调用一个函数,如下所示:

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

    def getRFID():
        return lib.NFCPollWrapper()

jk4Lib.so是同一文件夹中的共享库,从c程序

编译

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文件夹中运行示例程序。如果我还有任何其他信息,请告诉我。

2 个答案:

答案 0 :(得分:0)

您可能没有正确创建共享库。尝试类似:

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

编译后,在使用之前在某处安装共享库(例如/ usr / local / lib /)。如果您不使用ldconfig,请不要忘记更新LD_LIBRARY_PATH环境变量以包含安装路径。

查看http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html以获取有关如何在Linux上编译和安装共享库的更多详细信息。

从Python加载时,应指定soname,而不是.so文件的实际路径。

答案 1 :(得分:0)

您获得未定义的引用,因为动态链接器不知道如何解决它们。 为此,您必须在链接共享对象时添加必要的库

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