создать dylib в Mac, импортировать в python

Привет, я знаю, как сделать библиотеку (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

1

Решение

Ваша проблема заключалась в том, что вы уже загрузили 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, о которой вы заботитесь.

В целом, гораздо лучше вместо этого просто запустить новый процесс интерпретатора.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]