यदि मैं विंडोज़ पर स्रोत से सीपीथॉन का निर्माण करता हूं तो मुझे सी-एक्सटेंशन वाले पैकेज को स्थापित करने के लिए पाइप करने में समस्याएं आती हैं। ऐसा लगता है कि त्रुटि पुस्तकालयों को जोड़ने के दौरान होती है।

उदाहरण के लिए साइथन स्थापित करते समय (लेकिन यह अन्य सी एक्सटेंशन पैकेजों पर भी उसी त्रुटि के साथ क्रैश हो जाता है):

लिंक: घातक त्रुटि LNK1104: 'python38.lib' फ़ाइल नहीं खोल सकता

त्रुटि: कमांड 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.23.28105\bin\HostX86\x86\link.exe' बाहर निकलने की स्थिति 1104 के साथ विफल

इसका कारण यह है कि यह "python38.lib" नहीं खोल सकता है क्योंकि डिबग मोड में ".lib" फ़ाइल को "python38_d.lib" कहा जाता है।

CPython डेवलपर गाइड के त्वरित संदर्भ पर आधारित एक न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण (कमांड-लाइन पर) होगा :

git clone --branch v3.8.0 https://github.com/python/cpython.git
cd cpython
git checkout v3.8.0
.\PCbuild\build.bat -e -d
.\PCbuild\win32\python_d.exe -m ensurepip
.\PCbuild\win32\python_d.exe -m pip install pip --upgrade -vv
.\PCbuild\win32\python_d.exe -m pip install setuptools --upgrade -vv
.\PCbuild\win32\python_d.exe -m pip install cython -vv

परिणामी distutils.sysconfig.get_config_vars() है:

{'BINDIR': '...\\cpython\\PCbuild\\win32',
 'BINLIBDEST': ...\\cpython\\Lib',
 'EXE': '.exe',
 'EXT_SUFFIX': '_d.cp38-win32.pyd',
 'INCLUDEPY': '...\\cpython\\include;...\\cpython\\PC',
 'LIBDEST': '...\\cpython\\Lib',
 'SO': '_d.cp38-win32.pyd',
 'VERSION': '38',
 'exec_prefix': '...\\cpython',
 'prefix': '...\\cpython',
 'srcdir': '...\\cpython'}

क्या मुझे कुछ याद आ रहा है? क्या विंडोज़ पर पाइथन-डीबग बिल्ड पर सी-एक्सटेंशन बनाना समर्थित नहीं है? अगर यह समर्थित है: मैं इसे कैसे करूँगा?

3
MSeifert 1 पद 2019, 18:01

2 जवाब

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

विंडोज़ पर pythonXY.lib से लिंक करना थोड़ा डरपोक है। जब आप लिंकिंग के लिए कमांड लाइन को देखते हैं, तो आप देखेंगे कि लिंकर को कोई पायथन-लाइब्रेरी पास नहीं की गई है, यानी 'link.exe'। नोट: यह लिनक्स के मामले में भी है, लेकिन लिनक्स पर ऐसा करने की आवश्यकता नहीं है क्योंकि आवश्यक प्रतीकों को अजगर-निष्पादन योग्य द्वारा प्रदान किया जाएगा।

हालांकि, यह के माध्यम से जांचना dumpbin /dependents resulting.pyd आसान है, कि pythonXY.dll पर निर्भरता है, एक्सटेंशन-डेफिनिशन में extra_link_args = ["/VERBOSE:LIB"] जोड़ने और लिंकर के वर्बोज़-मोड को ट्रिगर करने से पता चलेगा कि लिंकर pythonXY.lib का उपयोग करता है।

गुप्त भाग: Microsoft Compler के पास एक पुस्तकालय के लिंकिंग को स्वचालित रूप से ट्रिगर करने के लिए एक विश्वास-प्रज्ञा #pragma comment(lib, ...) है, जो है पायथन-हेडर में का भी इस्तेमाल किया:

#               if defined(_MSC_VER)
                        /* So MSVC users need not specify the .lib
                        file in their Makefile (other compilers are
                        generally taken care of by distutils.) */
#                       if defined(_DEBUG)
#                               pragma comment(lib,"python39_d.lib")
#                       elif defined(Py_LIMITED_API)
#                               pragma comment(lib,"python3.lib")
#                       else
#                               pragma comment(lib,"python39.lib")
#                       endif /* _DEBUG */
#               endif /* _MSC_VER */

जैसा कि आप देख सकते हैं, डिबग संस्करण से लिंक करने के लिए, किसी को _DEBUG को परिभाषित करने की आवश्यकता है।

_DEBUG को विंडोज़ पर distutils द्वारा स्वचालित रूप से परिभाषित किया जाता है, यदि build_ext को विकल्प --debug के साथ बुलाया जाता है, उदा।

python setup.py build_ext -i --debug

यह अनुवादित pip के रूप में

pip install --global-option build --global-option --debug XXXXX

जिसकी व्याख्या मोटे तौर पर इस प्रकार की जा सकती है: ट्रिगर build कमांड (जिसमें build_ext-कमांड भी शामिल है) विकल्प के साथ --debug इंस्टॉल करने से पहले।


डीबग सी-एक्सटेंशन का निर्माण करते समय एक और सूक्ष्मता, इसके अलावा और भी बहुत कुछ है। विंडोज़ पर:

#ifdef _DEBUG
#       define Py_DEBUG
#endif

परिभाषित होने के बाद Py_DEBUG मैक्रो का अर्थ असंगत एबीआई है Python3.8 तक, क्योंकि यह भी मान लिया था Py_TRACE_REFS जिससे PyObject का मेमोरी लेआउट अलग हो जाता है और रिलीज़ मोड में कुछ अतिरिक्त कार्यक्षमता गायब हो जाती है।

हालाँकि, Python3.8 के बाद से, कोई शायद लापता pythonXY_d.lib/pythonYX.lib को किसी अन्य संस्करण से लिंक करने वाले सिमलिंक के रूप में प्रदान करके इससे दूर हो सकता है।

1
ead 7 पद 2019, 09:48

यह कोड थोड़ा हैकी है, लेकिन मेरे लिए MSVC19 पर काम करता है, डिबग पायथन पुस्तकालयों के निर्माण के बिना एप्लिकेशन को डीबग करने की अनुमति देता है।

#ifdef _DEBUG
#define _DEBUG_WAS_DEFINED
#undef _DEBUG
#endif

#include "Python.h"

#ifdef _DEBUG_WAS_DEFINED
#define _DEBUG
#undef _DEBUG_WAS_DEFINED
#endif
2
Fairyteller 2 जिंदा 2020, 19:09