找不到-llibc

时间:2012-09-01 16:55:10

标签: c linker libc

我是C菜鸟,所以这可能是一个愚蠢的问题。我正在尝试编译一个.so文件(共享库,如果我有我的术语正确)的C对象(.o文件),用于通过ctypes将它们导入Python的明确目的。我首先使用

编译* .so
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.solibc.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。

真心感谢任何帮助!

2 个答案:

答案 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检查)允许编译器读取这些定义。显然它没有读过它们。