سؤال

مرحبًا ، أنا أعرف كيفية صنع المكتبة (DLL) في Windows مع Visual Studio 2012 مع C ++ والاستيراد في Python مع ctypes تعمل بشكل رائع

مثال صغير هنا

lib.cpp

#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT int sum(int a,int b)
{
return (a+b);
}

ليب

int sum(int,int); 

test.py

from ctypes import *
mydll=cdll.LoadLibrary('lib.dll')
print mydll.sum(2,2)

أحاول تشغيل نفس الرمز في MAC مع إصدار XCODE 4.4 عندما أكون في Xcode أحصل على رسالة المتحاربة

__declspec attribute 'dllexport' is not supported

وعندما استيراد lib.dylib في بيثون ، أصاب خطأ

AttributeError: dlsym(0x101afba30, sum): symbol not found

ما أقوم به خطأ ؟ هل يمكن لأحد أن يكتب رمزًا بسيطًا كيف يمكنني صنع dylib في Mac مع Xcode صحيح للاستيراد باستخدام Ctypes في Python 2.6.4

أو

هي طريقة أفضل لاستيراد libaries في بيثون في كلا النظامين لنظام Mac والفوز؟

Basic أحب كتابة التعليمات البرمجية في Windows مع Visual Studio 2012 اجعل DLL I ومن ثم برنامج التحويل البرمجي البسيط في Mac مع Xcode والاستيراد في Python

هل كانت مفيدة؟

المحلول

كانت مشكلتك أن لديك بالفعل Dylib تم تحميله في مترجم Python الخاص بك. فقط إعادة بناء ذلك لن يؤثر على ما قمت بتحميله في الذاكرة.

مجرد القيام بآخر LoadLibrary قد تعيد أو لا تعيد تحميل المكتبة ، ولا توجد طريقة لإجبارها على القيام بذلك.

لا توجد أيضًا طريقة لتفريغ المكتبات وإعادة تحميلها ctypes. السبب الرئيسي هو أنه لا توجد طريقة آمنة للقيام بذلك على جميع المنصات - في الواقع ، قبل 10.4 ، كان نظام التشغيل X نفسه منصة. (وما زال بيثون لديه رمز المصدر الحالي في الشجرة لدعم ما قبل 10.4 OS X في ctypes.) ولكن أيضًا ، فإن محاولة التوصل إلى نموذج يقوم بالأشياء بالطريقة الآمنة على كل منصة ليست تافهة تمامًا. لذا، ctypes لا تحاول.

إذا كنت بحاجة حقًا إلى القيام بذلك ، _ctypes وحدة تحتها ctypes بشكل عام تصدر الوظائف اللازمة إلى بيثون. إذا كنت تعرف أسماء النظام الأساسي الخاص بك ، فيمكنك العثور عليها help(_ctypes), ، أو عن طريق النظر في المصدر.

باختصار ، على معظم منصات POSIX الحديثة (بما في ذلك OS X 10.5+) إنه _ctypes.dlclose(mydll._handle), ، بينما في Win32 ، هو كذلك _ctypes.FreeLibrary(mydll._handle). في كلتا الحالتين ، إذا استخدمت من أي وقت مضى mydll مرة أخرى (أو أي وظائف أو قيم كنت تشير إليها) ، يجب أن تصلي من أجل segfault. يمكنك أيضا segfault على الخروج. وعلى Windows ، قد لا تحرر المكتبة فعليًا عند طلبها ، وفي بعض الحالات يجب عليك أن تسأل المكتبة إذا كانت جاهزة للتفريغ قبل أن تتمكن ال FreeLibrary مستندات على MSDN ، وبالطبع manpage ل dlclose(3) على كل نظام posix تهتم به.

بشكل عام ، إنها فكرة أفضل بكثير لبدء عملية مترجم جديد بدلاً من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top