2011-02-18 8 views
8

है मैं एक विक्रेता सी ++ लाइब्रेरी के लिए बाध्यकारी लिखने की कोशिश कर रहा हूं। मैंने अन्य मॉड्यूल में इनिट फ़ंक्शंस को परिभाषित करने के लिए नीचे दिए गए स्निपेट का सफलतापूर्वक उपयोग किया है, लेकिन इस में यह काम नहीं कर रहा है: यह ठीक से संकलित करता है, लेकिन जैसे ही मैं इसे परीक्षण में आयात करने की कोशिश करता हूं, आयात इरर फेंकता है स्क्रिप्ट। क्या गलत हो सकता है?आयात त्रुटि: गतिशील मॉड्यूल init फ़ंक्शन को परिभाषित नहीं करता है, लेकिन यह

#ifndef PyMODINIT_FUNC /* declarations for DLL import/export */ 
#define PyMODINIT_FUNC void 
#endif 
PyMODINIT_FUNC initclient(void) { 

    PyObject* m; 

    ClientType.tp_new = PyType_GenericNew; 
    if (PyType_Ready(&ClientType) < 0) 
     return; 

    m = Py_InitModule3("client", client_methods, "Client module"); 
    Py_INCREF(&ClientType); 
    PyModule_AddObject(m, "Client", (PyObject *) &ClientType); 

} 

यह 32-बिट लिनक्स पर है, जीसीसी 4.4.4 के साथ।

+3

कौन सा मंच है, संकलक, ...? –

उत्तर

-3

यह पाइथन या कंपाइलर से असंबंधित हो गया, लेकिन एक गलत कंपाइलर incantation (मेकफ़ाइल संपादित करते समय अधिक ध्यान देना होगा)।

+24

यह बहुत अच्छा होगा यदि आप अन्य लोगों के लिए अपना समाधान शामिल कर सकते हैं जिनके पास एक ही समस्या है! – nont

+1

@djc आपके समाधान पर कोई अतिरिक्त जानकारी है? मैं वर्तमान में इस समस्या पर फंस गया हूं – Awalias

+1

क्षमा करें, मुझे याद नहीं है कि वास्तविक समस्या क्या थी, और मुझे अपने संस्करण नियंत्रण भंडार में प्रासंगिक परिवर्तन नहीं मिल रहे हैं। – djc

7

मुझे एक ही समस्या थी। संकलन समय पर:

  • अजगर हैडर के लिए पथ: ठीक है
  • अजगर पुस्तकालय के लिए पथ: ठीक है पायथन पुस्तकालय के खिलाफ
  • लिंक: ठीक है की जरूरत तीसरे पक्ष पुस्तकालयों/वस्तु फ़ाइलों के खिलाफ
  • लिंक: ठीक

मैं सिर्फ सी फ़ाइल है कि मेरे मॉड्यूल को परिभाषित करता है ... साई संकलित करने के लिए ...

तो, हाँ, पहली बात भूल गया जांचने के लिए: आपके मेकफ़ाइल या आपके संकलन कमांड! :)

+0

आपने मेरा दिन बचाया! मैंने अपनी निर्माण स्क्रिप्ट चलना लिखा हालांकि सभी स्रोत कोड पथ, लेकिन मुख्य file.c को भूल जाओ, ... sigh – davyzhang

5

मुझे एक ही त्रुटि संदेश था, लेकिन ऐसा इसलिए था क्योंकि मैंने अपनी .c फ़ाइल का नाम बदल दिया, और कोड के अंदर नाम अपडेट करना भूल गया। "Initxxx" फ़ंक्शन और इसके अंदर एक तर्क।

0

लिनक्स पर यह इस मामले में स्ट्रेस चलाने में मदद कर सकता है। जांचें कि लाइब्रेरी पायथन का नाम खोजना आपके द्वारा बनाई गई लाइब्रेरी के नाम जैसा ही है।

0

बड़ा घूँट प्रलेखन here का उल्लेख है:

This error is almost always caused when a bad name is given to the shared object file. For example, if you created a file example.so instead of _example.so you would get this error.

1

करें कि आप अपने _wrap.cxx शामिल करें। ऐसा लगता है कि यह आपके मॉड्यूल में संकलित नहीं होता है।

5

सुनिश्चित करें कि आप पाइथन संस्करणों को मिश्रित नहीं करते हैं। पायथन संस्करण 2 में init function को Init_ कहा जाता था, जबकि संस्करण 3 में इस फ़ंक्शन को PyInit_

मेरे मामले में ऐसा हो रहा था जब SWIG 3.0.2 ने बाइंडन 3.4 उत्पन्न करने के लिए पाइथन 3.4 का उपयोग किया था, जबकि मेरे पायथन आईडीई को पायथन 2.7 कहा जाता था दुभाषिया।

#if PY_VERSION_HEX >= 0x03000000 
# define SWIG_init PyInit__<modulename> 

#else 
# define SWIG_init init_<modulename> 

#endif 

linux आप भी अपने .so निर्यात की जाँच करने के लिए निम्न आदेश का उपयोग कर सकते पर::

nm -D <modulename> | grep <modulename> 

यह आपको दे देंगे

आप उत्पन्न .cxx फ़ाइल में अंतर देख सकते हैं आपकी लाइब्रेरी के भीतर init फ़ंक्शन का नाम।

0

इंटरफ़ेस फ़ाइल में, बड़ा घूँट का उपयोग कर पता चलता है:

#define SWIG_FILE_WITH_INIT 
संबंधित मुद्दे

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