gpt4 book ai didi

python - setuptools:从 C++ 代码构建共享库,然后构建链接到共享库的 Cython 包装器

转载 作者:搜寻专家 更新时间:2023-10-31 00:53:18 24 4
gpt4 key购买 nike

我们有一堆 C++ 文件,其中包含我们使用 Cython 包装到 Python 的类。我们使用 setuptools 来构建 Cython 扩展。这一切都很好,我们按照这里的指南进行操作: http://cython.readthedocs.io/en/latest/src/userguide/wrapping_CPlusPlus.html

我们基本上就是在做这样的事情

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

setup(ext_modules = cythonize(
"rect.pyx", # our Cython source
sources=["Rectangle.cpp"], # additional source file(s)
language="c++", # generate C++ code
))

我们不喜欢必须重新编译所有内容,即使只有 Cython 部分发生变化,rect.pyx在这个例子中。事实上我们从来没有碰过 .cpp文件,但更改 .pyx经常归档。

我们想编译 .cpp文件分别放入静态或共享库中,然后构建.pyx独立文件,链接到从 .cpp 生成的库文件。使用 make 可以轻松实现所有这些或 cmake , 但我们想要一个仅使用 setuptools 的纯 Python 解决方案.模型代码看起来像这样:

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

class CppLibary:
# somehow get that to work

# this should only recompile cpplib when source files changed
cpplib = CppLibary('cpplib',
sources=["Rectangle.cpp"], # put static cpp code here
include_dirs=["include"])

setup(ext_modules = cythonize(
"rect.pyx", # our Cython source
libraries=[cpplib], # link to cpplib
language="c++", # generate C++ code
))

最佳答案

setup 中有一个看似未记录的功能可以执行此操作,例如:

import os

from setuptools import setup
from Cython.Build import cythonize

ext_lib_path = 'rectangle'
include_dir = os.path.join(ext_lib_path, 'include')

sources = ['Rectangle.cpp']

# Use as macros = [('<DEFINITION>', '<VALUE>')]
# where value can be None
macros = None

ext_libraries = [['rectangle', {
'sources': [os.path.join(ext_lib_path, src) for src in sources],
'include_dirs': [include_dir],
'macros': macros,
}
]]

extensions = [Extension("rect",
sources=["rect.pyx"],
language="c++",
include_dirs=[include_dir],
libraries=['rectangle'],
)]

setup(ext_modules=cythonize(extensions),
libraries=ext_libraries)

libraries 参数构建在目录 rectangle 中找到的外部库,包含目录 rectangle/include 在它和扩展之间是公共(public)的。

还从 distutils 切换到 setuptools 的导入,后者已被弃用,现在是 setuptools 的一部分。

没有看到关于此参数的任何文档,但看到它在其他项目中的使用。

这个是未经测试的,如果不起作用,请提供示例文件进行测试。

关于python - setuptools:从 C++ 代码构建共享库,然后构建链接到共享库的 Cython 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49266003/

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