我是C菜鸟,所以这可能是一个愚蠢的问题。我正在尝试编译一个.so文件(共享库,如果我有我的术语正确)的C对象(.o文件),用于通过ctypes
将它们导入Python的明确目的。我首先使用
gcc -shared -o libvARAM.so ARAM.o ARAM_io.o io.o pre.o rule.o stat.o ART.o vARAM.o
这很有效,除了当我尝试通过ctypes加载时,我获得了奖励:
OSError: ./libvARAM.so: undefined symbol: max
经过一番挖掘,我意识到max不是标准的C函数。调用ldd libvARAM.so
告诉我其中一个依赖项是libc.so.6
。我创建了一个符号链接libc.so
到libc.so.6
,然后尝试重新编译我的.so
gcc -shared -o libvARAM.so ARAM.o ARAM_io.o io.o pre.o rule.o stat.o ART.o vARAM.o -llibc
生成
/usr/bin/ld: cannot find -llibc
如果我也尝试-L/lib/i386-linux-gnu/ -llibc
,则会生成相同的错误。我知道this线程,但觉得它与我的情况无关,因为有一个makefile的解决方案。如果这很重要,我正在使用Xubuntu。
真心感谢任何帮助!
答案 0 :(得分:2)
一:链接器标志不起作用。对于libXYZ.so
,相应的链接器标志不是-llibXYZ
,而只是-lXYZ
。
二:即使这不是必需的,因为C标准库(-lc
)会自动链接到可执行文件。
三:你的问题很可能是在其中一个头文件中定义了max()
宏(而不是函数),但你不包括这个头文件,所以编译器不知道它是一个宏并将其视为一个函数 - 当然它无法在libc.so中找到它,因为它不存在。
答案 1 :(得分:0)
发布此信息,以便其他新手看到它时,他们会看到答案......基本上,我的头文件如下:
#ifdef UNIX
#define min(x, y) (x<y ? x : y)
#define max(x, y) (x<y ? y : x)
#endif
删除第一行和最后一行(即没有ifdef
检查)允许编译器读取这些定义。显然它没有读过它们。