gpt4 book ai didi

python - 使用 cython : all strings are empty 包装一个 c++ DLL

转载 作者:太空宇宙 更新时间:2023-11-04 13:13:56 24 4
gpt4 key购买 nike

<分区>

我正在尝试使用 cython 包装一个用 C++ 编写的 DLL。最后我将无法访问源代码,因此在编译包装器的过程中不能使用 c++ 源代码本身,只有 .dll.lib.h。一切都编译良好。但是,我立即发现字符串表现不佳。例如,dll返回简单字符串的函数无法正常工作:cython 代码总是得到一个空字符串。我在 Windows 7 上。我已验证以下内容。

  • DLL 由 Visual Studio 2015(即 v 1900)构建,并使用处于调试状态的 2015 工具集模式。我尝试使用/MTd 和/MDd 标志进行编译。生成的 .lib 和 .dll 文件是与下面所有其他文件放在同一个文件夹中。
  • 我的 python 3.5 发行版也是由 VS 2015 构建的,适用于 32 位。

    $ python -iu
    Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)] on win32
  • 当我使用包含返回字符串的函数的虚拟 C++ 源代码进行编译时,它只是工作。使用 dll 它不起作用。

设置.py:

from distutils.core import setup
from Cython.Build import cythonize

setup(ext_modules=cythonize(
"test.pyx", # our Cython source
))

测试.pyx:

# distutils: language = c++
# distutils: libraries = MyDLL
# distutils: include_dirs = .
# distutils: library_dirs = .
from libcpp.string cimport string

cdef extern from "MyDLL.h" namespace "somenamespace":

int ReturnSomeInt()
string ReturnSomeString()

def run():
cdef string s = string(b'abcdefg')
print(s)
cdef int i = ReturnSomeInt()
print(i)
cdef string problem = ReturnSomeString()
print(problem)

MyDLL.h:

__declspec(dllexport) int ReturnSomeInt();
__declspec(dllexport) std::string ReturnSomeString();

用于编译 MyDLL 的 C++ 代码片段:

__declspec(dllexport) int ReturnSomeInt() { return 42; }
__declspec(dllexport) std::string ReturnSomeString() { cout << "debug..." << endl; return "Hello world!"; }

主要.py:

from test import run
run()

我使用命令编译

$ python setup.py build_ext --inplace --force && python -u main.py

运行这个打印

b'abcdefg'
42
debug... # printed by the dll function ReturnSomeString()
b'' # Should've printed: b'Hello World!'

我们可以验证 MyDLL 中的 ReturnSomeString() 是否实际被调用,因为它将一些文本发送到标准输出。

我没有检查什么?

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com