Привет, я знаю, как сделать библиотеку (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);
}
lib.h
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 в Python я получаю ошибку
AttributeError: dlsym(0x101afba30, sum): symbol not found
что я делаю не так?
Может кто-нибудь написать простой код, как я могу сделать Dlib в Mac с правильным кодом XCode для импорта с Ctypes в Python 2.6.4
ИЛИ ЖЕ
Есть лучший способ импортировать библиотеки в Python в обеих системах
для Mac и выиграть?
Основной я люблю писать код в Windows с Visual Studio 2012 Make Dll я
а затем простой компилятор в Mac с Xcode и импорта в Python
Ваша проблема заключалась в том, что вы уже загрузили dylib в ваш интерпретатор Python. Простое восстановление не повлияет на то, что вы загрузили в память.
Просто делаю другое LoadLibrary
может или не может перезагрузить библиотеку, и нет никакого способа заставить ее сделать это.
Также нет возможности выгрузить и перезагрузить библиотеки в ctypes
, Основная причина в том, что не существует безопасного способа сделать это на всех платформах — фактически, до 10.4 OS X сама была такой платформой. (И Python до сих пор текущий исходный код в дереве поддерживать предварительно 10.4 OS X в ctypes
.) Кроме того, пытаться придумать модель, которая делает вещи безопасным образом на каждой платформе, не совсем тривиально. Так, ctypes
не пытается
Если вам действительно нужно это сделать, _ctypes
модуль под ctypes
обычно экспортирует необходимые функции в Python. Если вы знаете названия для вашей платформы, вы можете найти их с помощью help(_ctypes)
или, посмотрев на источник.
Вкратце, на большинстве современных платформ POSIX (включая OS X 10.5+) это _ctypes.dlclose(mydll._handle)
в то время как на Win32, это _ctypes.FreeLibrary(mydll._handle)
, В любом случае, если вы когда-либо используете mydll
Снова (или любые функции или значения, на которые вы ссылались из него), вам следует помолиться за ошибку. Вы также можете segfault на выходе. А в Windows она может не освободить библиотеку, когда вы об этом просите, и в некоторых случаях вы должны спросить библиотеку, готова ли она выгружаться, прежде чем вы сможете это сделать, и есть сложности с многопоточностью, и… ну, просто прочитайте FreeLibrary
документы на MSDN и, конечно же, справочную страницу для dlclose(3)
в каждой системе POSIX, о которой вы заботитесь.
В целом, гораздо лучше вместо этого просто запустить новый процесс интерпретатора.
Других решений пока нет …