मैं यह ट्यूटोरियल boost.python से साझा लाइब्रेरी बनाने के लिए। यहां एक सरल कोड है जो उन तरीकों को परिभाषित करता है जिन्हें मैं अजगर को उजागर करना चाहता हूं।

#include <boost/python.hpp>
#include <iostream>

const int oneforth(int num, int bound) {
    if (num < bound) {return num;}
    return oneforth(num * (1/4), bound);
}


BOOST_PYTHON_MODULE(modd) //python module name
{
    using namespace boost::python;
    def("oneforth", oneforth); //python method
}


int main() {
    std::cout << oneforth(10, 4);
    return 0;
}
ai

मैं oneforth फ़ंक्शन को उजागर करना चाहता हूं ताकि मैं from modd import oneforth का उपयोग कर सकूं।

मैं साझा पुस्तकालय का निर्माण कर रहा हूँ *.so का उपयोग कर -

g++ -c -fPIC py.cpp -o py.o
g++ -shared py.so  py.o

जब भी मैं डायनामिक py.so आयात करने का प्रयास करता हूं, तो मुझे undefined symbol जैसी त्रुटियां मिलती हैं। मैं क्या गलत कर रहा हूं? इस तरह कोई साझा पुस्तकालय कैसे बना सकता है?

1
PatXio 5 फरवरी 2021, 20:41

1 उत्तर

सबसे बढ़िया उत्तर

मैंने इसे पुन: पेश करने की कोशिश की और दो अलग-अलग त्रुटि संदेश 'जैसे अपरिभाषित प्रतीक' प्राप्त किए। मैं दोनों को समझाऊंगा क्योंकि मैं 100% निश्चित नहीं हूं कि आपने किसका सामना किया।

यह पहला था:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /mnt/tmpfs/py.so: undefined symbol: _ZNK5boost6python7objects21py_function_impl_base9max_arityEv

यहाँ अपरिभाषित प्रतीक एक उलझा हुआ c++ नाम boost::python::objects::py_function_impl_base::max_arity() const है जो उदाहरण के लिए libboost_python39.so में पाया जा सकता है। इसका मतलब है कि आपको इस प्रतीक को उपलब्ध कराने के लिए अपनी लाइब्रेरी को -lboost_python39 से लिंक करना होगा।

दूसरा था:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define module export function (PyInit_py)

यह तब चला गया जब मैंने पुस्तकालय फ़ाइल को मॉड्यूल नाम दिया जो स्रोत कोड modd.so में उल्लिखित है। मैंने पहले कभी boost_python का उपयोग नहीं किया है, इसलिए मैं गारंटी नहीं दे सकता कि यह वास्तव में त्रुटि का अर्थ है।

टीएल;टीआर

मैं इसे दूसरी बिल्ड लाइन को बदलकर काम कर रहा हूं

g++ -shared -o modd.so py.o -lboost_python39
2
greyjedi 6 फरवरी 2021, 01:23
अंत में, यह काम करता है! धन्यवाद। मुझे आश्चर्य है कि Extention distutils.core से setup.py में निर्माण करते समय कोई इस ध्वज का उपयोग कैसे कर सकता है?
 – 
PatXio
6 फरवरी 2021, 10:50