2012-12-08 10 views
5

मैंने बिना किसी त्रुटि के पाइथन 2.7 को स्थिर रूप से संकलित किया है। अपने निर्माण के परीक्षण के लिए मैं यह स्निपेट का उपयोग करें:पायथन - Py_ संकलन के दौरान अनसुलझाइज करें

#include "Python.h" 
int main() 
{ 
    Py_Initialize(); 
} 

और मैं इसे इस तरह संकलन कर रहा हूँ:

$ gcc -static -I/path/to/python/header -L/path/to/my/staticpythonlib \ 
-lpython2.7 -ldl -l_all_other_needed_lib /tmp/my_previous_snippet.c -o myouput 

हालांकि, एक त्रुटि हुई। जीसीसी ने प्रसिद्ध undefined reference का दावा किया है।

test.c :(पाठ + 0x1):। 'Py_Initialize'

मजे की बात करने के लिए अपरिभाषित संदर्भ मैं (शब्दाडंबर ध्वज के साथ जीसीसी इस्तेमाल किया मैं परिणाम यहाँ पेस्ट नहीं होगा) और संकलक कहते हैं, यह मेरे libpython का उपयोग कर रहा है, लेकिन संदर्भ नहीं मिला। तो मैं अपने स्थिर python2.7 पुस्तकालय के प्रतीक सूचीबद्ध:

$ nm /path/to/pythonlib |grep Py_Initialize 
frozenmain.o   U Py_Initialize 
pythonrun.o 0000009e9 T Py_Initialize 
pythonrun.o 000000052 T Py_Initialize_Ex 
main.o     U Py_Initialize 

हम देख सकते हैं, कि Py_Initialize सही ढंग से pythonrun.o में संदर्भित है। हालांकि मुझे नहीं पता कि कैसे कंपेलर ने सही ऑब्जेक्ट फ़ाइल चुना है।

मेरे प्रश्न हैं:

  1. कैसे मुझे यकीन है कि हो सकता है, कि जीसीसी मेरी .a lib में सही वस्तु फ़ाइल का उपयोग करता है?
  2. क्या मेरे संकलन विकल्पों में कुछ गड़बड़ है?

आपकी सहायता के लिए धन्यवाद।

+0

यह नहीं लिंकेज संकलन के दौरान के दौरान होने वाली एक त्रुटि है। – alk

उत्तर

6

ऑर्डर मायने रखता है! अधिक विशेष रूप से, जीसीसी मामलों के लिए तर्कों में आदेश। अधिक विशेष रूप से, यदि bar ऑब्जेक्ट लाइब्रेरी से फ़ंक्शन bluh का उपयोग करता है, तो ऑर्डर -lbleh bar.o समस्याग्रस्त है क्योंकि यह में फ़ंक्शन bluh फ़ंक्शन के लिए gcc देखने का कोई कारण नहीं प्रदान करता है। दूसरी तरफ, जब आप bar.o -lbleh का उपयोग करते हैं तो जीसीसी जानता है कि आप bluh का जिक्र कर रहे हैं और जब यह -lbleh को संभालने में सक्षम होता है तो यह निर्भरता को हल करने का प्रयास करता है। इसका तुरंत http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html पर उल्लेख किया गया है। एक नियम के रूप में, हमेशा अपनी वस्तुओं के बाद पुस्तकालय निर्दिष्ट करता है।

आपकी समस्या को पुन: पेश करने के लिए, के रूप में एक फ़ाइल a1.c बनाएँ:

#include "Python.h" 

int main() 
{ 
    Py_Initialize(); 
    return 0; 
} 

अब gcc -static -I/usr/include/python2.7 -L/usr/lib/python2.7/config/ -lpython2.7 -ldl -lm -lutil -lz -pthread -o a1 a1.c साथ संकलन। यह Py_Initialize को अपरिभाषित संदर्भ देता है। बेशक आपको अपनी स्थापना से मेल खाने के लिए पथ बदलना होगा।

अब, gcc -static -I/usr/include/python2.7 -L/usr/lib/python2.7/config/ -o a1 a1.c -lpython2.7 -ldl -lm -lutil -lz -pthread के साथ संकलित करें और यह काम करता है (संभवतः कई चेतावनियों को अनदेखा कर रहा है, जो एक अलग मामला है)।

1

मैं अजगर 2.7 का उपयोग कर रहा हूं और पर्यावरण चर में पायथन स्थापना निर्देशिका का पथ सेट कर रहा हूं। मैं बूस्ट 1.5 का भी उपयोग करता हूं।0

नीचे कोड

#include <python2.7/Python.h> 
int main() 
{ 
Py_Initialize(); 

PyRun_SimpleString("print \"Hello, world!\""); 

Py_Finalize(); 
return 0; 
} 

भागो आदेश संकलित करने के लिए चरणों का पालन करें: -

g++ hello.cc -lpython2.7 
./a.out 
संबंधित मुद्दे