Pergunta

Olá, eu sei como fazer biblioteca (DLL) no Windows com o Visual Studio 2012 com C ++ e importar em Python com ctypes funcionam muito bem

aqui um pequeno exemplo

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)

Eu tento executar o mesmo código no Mac com a versão Xcode 4.4 quando eu bato no xcode, recebo uma mensagem em guerra

__declspec attribute 'dllexport' is not supported

e quando importar lib.dylib em python eu recebo erros

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

O que eu faço de errado? Alguém pode escrever um código simples como eu posso fazer um dylib no mac com o xcode correto para importar com ctypes no python 2.6.4

OU

O AS é melhor maneira de importar liberes no Python em ambos os sistemas para Mac e Win?

BASIC Gosto de escrever código no Windows com o Visual Studio 2012 Make Dll I e, em seguida, compilador simples no Mac com Xcode e importar no Python

Foi útil?

Solução

Seu problema era que você já tinha o Dylib carregado no seu intérprete Python. Apenas reconstruí -lo não afetará o que você carregou na memória.

Apenas fazendo outro LoadLibrary Pode ou não recarregar a biblioteca e não há como forçá-la a fazê-lo.

Também não há como descarregar e recarregar as bibliotecas em ctypes. A principal razão é que não existe uma maneira segura de fazê -lo em todas as plataformas - na verdade, antes de 10.4, o próprio OS X era uma plataforma. (E Python ainda tem Código fonte atual na árvore Para apoiar o pré-10.4 OS X em ctypes.) Mas também, tentar criar um modelo que faça as coisas da maneira segura em todas as plataformas não é exatamente trivial. Então, ctypes não tenta.

Se você realmente precisa fazer isso, o _ctypes módulo abaixo ctypes Geralmente exporta as funções necessárias para o Python. Se você conhece os nomes da sua plataforma, pode encontrá -los com help(_ctypes), ou olhando para a fonte.

Resumidamente, na maioria das plataformas POSIX modernas (incluindo o OS X 10.5+), é _ctypes.dlclose(mydll._handle), enquanto estava no Win32, é _ctypes.FreeLibrary(mydll._handle). Em ambos os casos, se você usa mydll Novamente (ou quaisquer funções ou valores que você estava referenciando), você deve orar por um segfault. Você também pode se esgotar na saída. E no Windows, ele pode realmente não libertar a biblioteca quando você solicita e, em alguns casos a FreeLibrary documentos no msdn e, claro, a manpra para dlclose(3) Em todos os sistemas POSIX de que você se preocupa.

Em geral, é uma ideia muito melhor iniciar um novo processo de intérprete.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top