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