Невозможно использовать питон ctypes загрузить библиотеку акций C ++

голоса
0

Я следую указаниям этой страницы , чтобы попытаться вызвать функции C ++.
Вызов C / C ++ из Python?

Я пишу 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(); }
}

а затем использовать эти команды на Win 10 терминала:

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

Я получаю сообщение в терминале. Просто предупреждение. Pylib.so все еще по цветовому г ++.

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

Я пишу pylib.py :

from ctypes import *

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

Я получил сообщение об ошибке:

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)初始化例行程序失敗.
Этот смысл любит
OSError: [WinError 1114] Динамически подключаемая библиотека (DLL) подпрограмма инициализации не удалось

Моя среда

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

Я могу загрузить библиотеку C хорошо. но я продолжаю получать ошибки Dll после попытки много различных методов , чтобы написать код C ++, или сделать библиотеку акций с различным способом.


Обратите внимание , что: имя библиотеки изменяется каст в pylib2.dll. все , что я использую .soдля .dllдля имени файла DLL, я получаю ту же ошибку.

Это пример команды

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) 初始化例行程序失敗。

И это новый pylib.py код

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()
Задан 19/09/2018 в 13:24
источник пользователем
На других языках...                            


2 ответов

голоса
0

Я найти решение самостоятельно. Решение:

  1. Использование MinGW comipler или компилятор Microsoft C / C ++.
  2. Использование Python 32-битный интерпретатор.
  3. Не нужно копировать DLL из папки компилятора бен.

Во- первых, я использовал TDM-GCC MinGW компилятор , как C / C ++ компилятор раньше. Тогда я попробовать другой компилятор: MinGW . Я не могу сказать вам , что отличается от них, я не про парня. Но они производят другое сообщение об ошибке , когда я использую , ctypesчтобы загрузить две различные библиотеки DLL , которые компиляцию как в Python 3.6.6 64 bitпереводчике. Все они не смогли на Python 3.6.6 64 bitпереводчике.

Стараюсь 32-битную питон , чтобы загрузить DLL библиотеки. Она успехи загрузить библиотеку. Pylib.cpp код:

#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(); }
}

Команда компиляции:

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

Pylib.py код:

from ctypes import *

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

Ouput:

Hello

Спасибо за Pschill и другие предлагают новые методы.

Ответил 22/09/2018 в 06:50
источник пользователем

голоса
0

Вы используете GCC из MinGW для компиляции и компоновки кода. Поскольку код использует стандартную библиотеку C ++ ( #include <iostream>соотв. std::cout), Вам нужно сделать libstdc++-6.dllфайл доступным , который поставляется с GCC. Скопируйте DLL - файл в рабочем каталоге, то он должен работать.

Ответил 19/09/2018 в 14:22
источник пользователем

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