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

eud*_*xos 11 linker undefined-reference

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

#include<Python.h>
int main(){Py_Initialize(); Py_Finalize(); }
Run Code Online (Sandbox Code Playgroud)

我编译它(安装了python 2.7)as 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
Run Code Online (Sandbox Code Playgroud)

已安装标头,/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
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

yid*_*ing 20

尝试:

gcc -I/usr/include/python2.7 p.c -lpython2.7 
Run Code Online (Sandbox Code Playgroud)

链接器Py_Initialize在加载时还不知道它是必需的符号libpython2.7.a,所以它将它扔掉.然后它会变成po并抛出一个关于缺失符号的拟合.以这种方式排序将让链接器在后续输入中查找丢失的符号.

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

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


Jim*_*ian 8

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

g++ -I/usr/include/python3.5 hw.cpp -L/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5
Run Code Online (Sandbox Code Playgroud)

是的。顺序很重要。