मैं पर OSX हूँ, distutils साथ सी में एक साझा पुस्तकालय संकलित करने के लिए कोशिश कर रहा है' setup.py (अजगर में ctypes का उपयोग कर उपयोग करने के लिए)। मैं distutils के लिए नया हूँ, लेकिन मुझे समस्याएं आ रही हैं जब साझा लाइब्रेरी मैं संकलित करना चाहता हूँ (libreboundx.so) किसी अन्य साझा लाइब्रेरी (librebound.so) पर निर्भर करता है। स्पष्ट रूप से, modify_orbits_direct.c में मैंdistutils साथ संकलन सी साझा लाइब्रेरी 'setup.py, जब पुस्तकालय एक दूसरे साझा लाइब्रेरी पर निर्भर करता है
#include "rebound.h"
rebound.h निर्देशिका में है/उपयोगकर्ताओं/डीटी/पलटाव/src /, और rebound.h में सभी कार्यों साझा लाइब्रेरी librebound.so है, जो कर रहे हैं में/उपयोगकर्ता/डीटी/रिबाउंड /।
सीसी के साथ जोड़ने की तरह लग रहे हैं।
cc -fPIC -shared reboundx.o -L/Users/dt/rebound -lrebound -o libreboundx.so
अद्यतन: यह स्थिति वास्तव में धारा के अंत में उदाहरण की तरह लग रहा है। 3 https://docs.python.org/2/extending/building.html पर। मैं अपने setup.py नवीनीकृत किया है नकल करने के लिए है कि एक:
libreboundxmodule = Extension('libreboundx',
sources = [ 'src/reboundx.c',
'src/modify_orbits_direct.c'],
include_dirs = ['src', '/Users/dt/rebound/src'],
extra_compile_args=['-fstrict-aliasing', '-O3','-std=c99','-march=native', '-D_GNU_SOURCE', '-fPIC'],
library_dirs=['/Users/dt/rebound'],
libraries=['rebound'],
)
यह ठीक स्थापित करता है जब मैं चलाने
pip install -e ./
उत्पादन बिल्ड:
You are using pip version 7.0.3, however version 7.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Obtaining file:///Users/dtamayo/Documents/workspace/reboundx
Installing collected packages: reboundx
Running setup.py develop for reboundx
Successfully installed reboundx-1.0
लेकिन जब मैं
कोशिशimport reboundx
अजगर में
, मैं एक OSError मिलती है: dlopen (lib reboundx.so, 10): प्रतीक नहीं मिला: _reb_boundary_particle_is_in_box, जो अन्य लाइब्रेरी (librebound.so) में एक फ़ंक्शन है, जिसे libreboundx.so के लिए कोड में भी नहीं कहा जाता है।
यदि मैं साझा लाइब्रेरी को ऊपर सीसी कमांड से लिंक करता हूं, तो सब कुछ काम करता है, और मैं साझा लाइब्रेरी libreboundx.so का उपयोग कर सी में पूरी तरह से ठीक कर सकता हूं। यदि मैं वही libreboundx लेने की कोशिश करता हूं। तो मैं cc कमांड के साथ संकलित करता हूं और यह छड़ी जहां setup.py डाल दिया होगा, तो अजगर में reboundx आयात करने की कोशिश, मैं बजाय
OSError: dlopen(/Users/dtamayo/Documents/workspace/reboundx/reboundx/../libreboundx.so, 10): Library not loaded: librebound.so
मिल संदर्भित से: /Users/dtamayo/Documents/workspace/reboundx/libreboundx.so कारण: छवि
नहीं मिला यह एक rpath मुद्दा है, जहां रनटाइम पर libreboundx.so जहां एल देखने के लिए पता नहीं है की तरह हो सकता है ibrebound.so?
'पुस्तकालय = [' librebound ']' संदिग्ध लग रहा है। इसमें 'lib'-prefix नहीं होना चाहिए, लेकिन केवल' रिबाउंड' होना चाहिए। आप '-लिब्राउंडबाउंड' से लिंक नहीं करते हैं, लेकिन '-रबाउंड''। इसके अलावा, क्या आप बिल्ड-आउटपुट प्रदान कर सकते हैं? – deets
मैंने इसे प्रश्न में जोड़ा है। मुझे पुस्तकालयों में 'librebound' या 'rebound' के साथ सटीक वही व्यवहार/आउटपुट मिलता है (जो कुछ गलत बताता है!)। इसके अलावा, मैंने नीचे install_requires में 'rebound' जोड़ने का प्रयास किया। यह "आवश्यकता पहले से ही संतुष्ट है (अपग्रेड करने के लिए अपग्रेड करें):/उपयोगकर्ता/डेटामैयो/दस्तावेज़/वर्कस्पेस/रिबाउंड (रीबाउंडएक्स == 1.0 से) में रिबाउंड", लेकिन जब मैं पाइथन में आयात करता हूं तो वही त्रुटि देता है। – Dan
ओएस एक्स पर, 'otool -D' lib के 'install_name' को दिखाता है, और' install_name_tool -id' इसे बदल देगा। यदि आप लोडिंग मॉड्यूल से संबंधित पथ चाहते हैं, तो '@ loader_path' टोकन का उपयोग करें। 'Otool -L' का उपयोग करके सूची निर्भरताओं, और 'install_name_tool -change' का उपयोग करके उन्हें बदलें। आप '-rpath' निर्भरता खोज पथ भी सेट कर सकते हैं; यह एक सापेक्ष पथ के लिए '@ loader_path' का उपयोग कर सकता है। 'एक्सटेंशन' श्रेणी में 'rpath' पैरामीटर है, लेकिन यह वर्ग वास्तव में एक सामान्य साझा मॉड्यूल (विशेष रूप से विंडोज़ पर, यदि यह मायने रखता है) बनाने के लिए उपयुक्त नहीं है। आप सीधे gcc निष्पादित करने के लिए 'ccompiler.new_compiler' को कॉल कर सकते हैं। – eryksun