未定义参考 - 尽管通过LIB链接被发现(Undefined reference - despite

2019-07-05 21:57发布

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

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

我编译它(安装Python 2.7版)作为gcc -I/usr/include/python2.7 -lpython2.7 pc 。 它适用于其他机器很好,除了在Ubuntu的大多是清洁的chroot 12.04(精确),我不断收到

/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

有任何想法吗?

Answer 1:

尝试:

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

链接器不知道的还以为Py_Initialize是必需的符号在加载时libpython2.7.a ,所以它扔它拿走。 然后它得到PO和抛出一个合适的关于失踪的象征。 订购这种方式会让链接器的外观在后续投入的缺失象征。

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

这使得其中的命令写这个选项的差异; 链接器的搜索和处理库和目标文件在他们指定的顺序。 因此, foo.o -lz bar.o' searches library Z”文件foo.o的之后,但之前bar.o. 如果bar.o指`Z”的功能,这些功能可能不会被加载。



Answer 2:

我遇到了同样的问题链接,以及。 但对我来说这是不够的,提供-lpython 。 此外-L需要。 即

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

是的。 订购事宜。



Answer 3:

我遇到了同样的问题链接,并亲自我的问题是,我的32位的MinGW编译器无法加载64位Python库。 我在我的MinGW升级到64位,解决了我的问题。 在扎进同样的问题,如果有人新手在这里留下一张纸条。



Answer 4:

如果安装了蟒蛇3.x中,也许这个命令可以工作:

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

顺便说一句,你应该检查你的gcc和Python版本。

据我所知,如果gcc版本是5.4和Python版本是3.7,这是行不通的。(蟒蛇3.5是工作)

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



文章来源: Undefined reference - despite lib being found by linker