2012-12-19 15 views
6

द्वारा पाया जा रहा है मैं अजगर विकास फ़ाइलों की उपलब्धता के लिए परीक्षण करने के लिए एक छोटी सी कार्यक्रम है:अपरिभाषित संदर्भ - lib के बावजूद लिंकर

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

मैं इसे संकलन gcc -I/usr/include/python2.7 -lpython2.7 p.c के रूप में (अजगर 2.7 स्थापित के साथ)। यह 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 फ़ाइल में सूचीबद्ध है, और जीसीसी सही 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 

कोई भी विचार?

उत्तर

17

प्रयास करें:

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

लिंकर अभी तक पता नहीं है कि Py_Initialize एक आवश्यक प्रतीक है जब यह libpython2.7.a लोड करता है, तो यह इसे दूर tosses। और फिर यह पीओओ हो जाता है और गायब प्रतीक के बारे में एक फिट फेंकता है। इसे इस तरह से ऑर्डर करने से लिंकर बाद के इनपुट में लापता प्रतीक की तलाश करेगा।

देखें: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html

यह एक अंतर जहां आदेश में आप इस विकल्प को लिखने बनाता है; लिंकर पुस्तकालयों और ऑब्जेक्ट फ़ाइलों को उनके द्वारा निर्दिष्ट क्रम में खोज और संसाधित करता है। इस प्रकार, foo.o -lz bar.o' searches library z 'फ़ाइल foo.o के बाद लेकिन bar.o से पहले। यदि bar.o 'z' में फ़ंक्शंस को संदर्भित करता है, तो उन कार्यों को लोड नहीं किया जा सकता है।

+0

धन्यवाद, यह काम किया! नई बात सीखा। – eudoxos

+0

बीटीडब्ल्यू कोई विचार है कि यह अन्य मशीनों के लिए क्यों काम करता है? क्या वह संस्करण-निर्भर व्यवहार है? – eudoxos

+0

यह उस लिंकर पर निर्भर करता है जिसका उपयोग किया जा रहा है, मुझे लगता है। लेकिन अगर आप इसे बाद में डालते हैं तो यह हमेशा काम करेगा। – yiding

0

मुझे एक ही लिंकिंग समस्या का सामना करना पड़ा और व्यक्तिगत रूप से मेरी समस्या यह थी कि मेरा 32 बिट मिंगव कंपाइलर 64 बिट पायथन लाइब्रेरी लोड नहीं कर सकता है। मैं अपने मिंगव को 64 बिट तक अपग्रेड करता हूं और मेरी समस्या हल करता हूं। अगर कोई नौसिखिया एक ही समस्या में फंस गया तो यहां एक नोट छोड़ दिया।

3

मुझे भी वही लिंकिंग समस्या का सामना करना पड़ा। लेकिन मेरे मामले में यह -lpython प्रदान करने के लिए पर्याप्त नहीं था। -L भी आवश्यक था। अर्थात।

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

और हाँ। आदेश मामलों।

संबंधित मुद्दे