未定义的引用 - 尽管链接器找到了lib

时间:2012-12-19 11:14:56

标签: linker undefined-reference

我有一个简单的程序来测试python开发文件的可用性:

#include<Python.h>
int main(){Py_Initialize(); Py_Finalize(); }

我将它(安装了python 2.7)编译为gcc -I/usr/include/python2.7 -lpython2.7 p.c。它在其他机器上工作正常,除了在Ubuntu 12.04(精确)的大多数干净的chroot我一直在

/tmp/ccj8Mgjb.o: In function `main':
p.c:(.text+0x5): undefined reference to `Py_Initialize'
p.c:(.text+0xa): undefined reference to `Py_Finalize'
collect2: ld returned 1 exit status

安装了标头,/usr/lib/libpython2.7.so存在,但链接器仍然失败。该符号列在.so文件中,gcc正在阅读右侧libpython2.7.so

$ nm -D libpython2.7.so.1.0  | grep Py_Initialize
00000000000c9c20 T Py_Initialize
00000000000c9260 T Py_InitializeEx

$ strace -f gcc -I/usr/include/python2.7 -lpython2.7 /tmp/p.c 2>&1 |grep   libpython2.7 |grep open
[pid 10618] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libpython2.7.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10618] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libpython2.7.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10618] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libpython2.7.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10618] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libpython2.7.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10618] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libpython2.7.so", O_RDONLY) = 7

有什么想法吗?

4 个答案:

答案 0 :(得分:18)

尝试:

gcc -I/usr/include/python2.7 p.c -lpython2.7 

链接器在加载Py_Initialize时还不知道libpython2.7.a是必需的符号,因此将其抛弃。然后它到达p.o并抛出关于缺失符号的拟合。以这种方式排序将让链接器在后续输入中查找丢失的符号。

请参阅:http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

  

在您编写此选项的命令中,它会有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,在文件foo.o之后但在bar.o之前foo.o -lz bar.o' searches library z'。如果bar.o引用“z”中的函数,则可能无法加载这些函数。

答案 1 :(得分:5)

我也遇到了相同的链接问题。 但就我而言,提供-lpython是不够的。还需要-L。即。

g++ -I/usr/include/python3.5 hw.cpp -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5

是的。订单很重要。

答案 2 :(得分:0)

我遇到了相同的链接问题,我个人的问题是我的32位mingw编译器无法加载64位python库。我将我的mingw升级到64位并解决了我的问题。如果新手遇到同样的问题,请留下这里的注释。

答案 3 :(得分:0)

如果已安装python 3.x,则此命令可以正常工作:

g++ hw.cpp `/usr/bin/python3-config --cflags` `/usr/python3-config --ldflags`

顺便说一句,您应该检查一下gcc和python版本。

据我所知,如果gcc版本是5.4,而python版本是3.7,则它不起作用。(python 3.5是有效的)

实际上,当您运行/usr/bin/python3-config --cflags时,它是编译选项。