Вопрос

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

__declspec attribute 'dllexport' is not supported

и когда импортируется Lib.Dylib в Python, я получаю ошибку

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

Что я делаю не так? Может ли кто -нибудь написать простой код, как я могу сделать Dylib в Mac с xcode правильно, чтобы импортировать с помощью ctypes в Python 2.6.4

ИЛИ ЖЕ

Это лучший способ импортировать Libaries в Python в системе для Mac и Win?

Basic I Love Focure Code в Windows с Visual Studio 2012 Сделайте DLL I, а затем простой компилятор в Mac с XCode и Import in 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 вас заботится.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top