não pode usar ctypes Python para carregar biblioteca C ++ share

votos
0

I seguir as instruções desta página para tentar chamar funções C ++.
Chamando C / C ++ a partir de Python?

I escrever uma pylib.cpp

#include <iostream>

class Foo {
public:
    void bar() {
        std::cout << Hello << std::endl;
    }
};

extern C {
    Foo* Foo_new() { return new Foo(); }
    void Foo_bar(Foo* foo) { foo->bar(); }
}

e, em seguida, utilizar estes comandos no Win 10 terminal:

g++ -c -fPIC pylib.cpp -o pylib.o
g++ -shared -Wl,-soname,pylib.so -o pylib.so  pylib.o

Recebo a mensagem no terminal. Apenas um aviso. O pylib.so ainda ser maked pelo g ++.

pylib.cpp:1:0: warning: -fPIC ignored for target (all code is position independent)
 #include <iostream>
 ^

I escrever uma pylib.py :

from ctypes import *

lib = cdll.LoadLibrary('pylib.so')
f = lib.Foo()
f.bar()

Recebi a mensagem de erro:

Traceback (most recent call last):
  File C:/Users/Jack/PycharmProjects/dip_hw1/pylib.py, line 3, in <module>
    lib = cdll.LoadLibrary('pylib.so')
  File C:\Python\lib\ctypes\__init__.py, line 426, in LoadLibrary
    return self._dlltype(name)
  File C:\Python\lib\ctypes\__init__.py, line 348, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 1114] 動態連結程式庫 (DLL) 初始化例行程序失敗。

OSError: [winError 1114] 動態連結程式庫(DLL)初始化例行程序失敗.
Este significado gosta
OSError: [winError 1114] biblioteca de vínculo dinâmico (DLL) rotina de inicialização falhou

O meu ambiente é

Python: Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)] on win32
C/C++ Compiler: TDM-GCC MinGW
OS: Win 10

Eu posso carregar a biblioteca C também. mas eu continuar a ficar erro dll depois de tentar um monte de vários métodos para escrever o código C ++, ou para fazer biblioteca share com a maneira diferente.


Note-se que: o nome de mudanças biblioteca CPP pylib2.dll. tudo o que eu uso .sopara .dllo nome do arquivo dll, recebo o mesmo erro.

Este é o exemplo de comando

C:\Users\Jack\PycharmProjects\dip_hw1>dir
 磁碟區 C 中的磁碟沒有標籤。
 磁碟區序號:  1AB4-8568

 C:\Users\Jack\PycharmProjects\dip_hw1 的目錄

2018/09/20  下午 03:26    <DIR>          .
2018/09/20  下午 03:26    <DIR>          ..
2018/09/20  下午 10:49    <DIR>          .idea
2018/09/18  上午 11:12    <DIR>          image
2015/06/28  下午 02:28            58,880 libatomic-1.dll
2015/06/28  下午 02:28            69,120 libatomic_64-1.dll
2013/09/01  上午 09:38           149,207 libcharset-1.dll
2015/06/28  上午 05:50           145,934 libgcc_s_dw2-1.dll
2015/06/28  下午 02:28           114,176 libgcc_s_seh_64-1.dll
2015/06/28  下午 02:28           120,832 libgcc_s_sjlj-1.dll
2015/06/28  下午 02:28           934,400 libiconv-2.dll
2014/04/27  上午 06:46           484,613 libintl-8.dll
2015/06/28  下午 02:28           359,936 libquadmath-0.dll
2015/06/28  下午 02:28           354,816 libquadmath_64-0.dll
2015/06/28  下午 02:28            13,824 libssp-0.dll
2015/06/28  下午 02:28            18,944 libssp_64-0.dll
2015/06/28  下午 02:28         1,374,208 libstdc++-6.dll
2015/06/28  下午 02:28         1,405,952 libstdc++_64-6.dll
2015/06/28  下午 02:28            11,264 libvtv-0.dll
2015/06/28  下午 02:28            15,872 libvtv_64-0.dll
2015/06/28  下午 02:28            11,264 libvtv_stubs-0.dll
2015/06/28  下午 02:28            15,872 libvtv_stubs_64-0.dll
2015/06/28  下午 02:28            60,928 libwinpthread-1.dll
2015/06/28  下午 02:28            64,512 libwinpthread_64-1.dll
2018/09/17  下午 04:55             1,918 main.cpython-36.pyc
2018/09/19  下午 12:14            10,587 main.py
2018/09/19  下午 08:11           113,157 pylib.dll
2018/09/20  下午 03:26               188 pylib.py
2018/09/19  下午 11:02         2,695,132 pylib2.dll
2018/09/19  下午 11:07         2,695,135 pylib2.so
2018/09/17  下午 04:56                26 run.bat
2018/09/19  下午 02:05               627 test.py
2018/09/17  下午 04:55    <DIR>          __pycache__
              28 個檔案      11,301,324 位元組
               5 個目錄  171,916,886,016 位元組可用

C:\Users\Jack\PycharmProjects\dip_hw1>python pylib.py
C:\Users\Jack\PycharmProjects\dip_hw1
C:\Users\Jack\PycharmProjects\dip_hw1
Traceback (most recent call last):
  File pylib.py, line 7, in <module>
    lib = cdll.LoadLibrary('pylib2.dll')
  File C:\Python\lib\ctypes\__init__.py, line 426, in LoadLibrary
    return self._dlltype(name)
  File C:\Python\lib\ctypes\__init__.py, line 348, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: [WinError 1114] 動態連結程式庫 (DLL) 初始化例行程序失敗。

E este é o novo pylib.py código

from ctypes import *
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
print(dir_path)
print(os.getcwd())

lib = cdll.LoadLibrary('pylib2.dll')
f = lib.Foo()
f.bar()
Publicado 19/09/2018 em 13:24
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

I encontrar a solução por mim. A solução é:

  1. Usando MinGW comipler ou compilador Microsoft C / C ++.
  2. Usando interpretador de 32 bits.
  3. Não é necessário copiar dll da pasta bin compilador.

Primeiro, I utilizado o TDM-CCG MinGW Compiler como compilador C / C ++ antes. Então eu tente outro compilador: MinGW . Eu não posso dizer o que diferente entre eles, eu não sou um cara profissional. Mas eles produzem diferentes mensagem de erro quando eu uso ctypespara carregar os dois biblioteca dll diferente que compilar, tanto no Python 3.6.6 64 bitintérprete. Todos eles fracassaram no Python 3.6.6 64 bitintérprete.

Tento python de 32 bits para carregar a biblioteca DLL. Ele sucessos para carregar biblioteca.
O pylib.cpp código:

#include <iostream>
using namespace std;

class Foo {
public:
    void bar() {
        cout << "Hello" << endl;
    }
};

extern "C" {
    Foo* Foo_new() { return new Foo(); }
    void Foo_bar(Foo* foo) { foo->bar(); }
}

comando de compilação:

g++ -shared -o pylib.dll pylib.cpp

O pylib.py código:

from ctypes import *

lib = cdll.LoadLibrary('pylib.dll')
f = lib.Foo_new()
lib.Foo_bar(f)

O ouput:

Hello

Obrigado por Pschill e outros propõem novos métodos.

Respondeu 22/09/2018 em 06:50
fonte usuário

votos
0

Você está usando gcc a partir MinGW para compilar e vincular o código. Desde que o código usa a biblioteca C ++ padrão ( #include <iostream>resp. std::cout), Você precisa fazer o libstdc++-6.dllarquivo disponível que vem com gcc. Copie o arquivo .dll no diretório de trabalho, em seguida, ele deve funcionar.

Respondeu 19/09/2018 em 14:22
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more