12

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

4 に答える 4

25

試す:

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 libraryz' はファイル foo.o の後、bar.o の前です。bar.o が `z' 内の関数を参照する場合、それらの関数はロードされない可能性があります。

于 2012-12-19T12:04:27.017 に答える
0

私は同じリンクの問題に遭遇しました。個人的に私の問題は、32 ビットの mingw コンパイラが 64 ビットの Python ライブラリを読み込めないことでした。mingw を 64 ビットにアップグレードし、問題を解決しました。初心者が同じ問題に遭遇した場合に備えて、ここにメモを残してください。

于 2016-07-17T23:45:03.863 に答える