【问题标题】:Adding C library to c++11 distutils project将 C 库添加到 c++11 distutils 项目
【发布时间】:2020-02-18 15:04:13
【问题描述】:

我有一个 c++11 项目,我想将其导出为包以供 python 脚本使用。我的代码使用我下载并添加到项目中的 lzfse C 文件。 该项目需要在 MacOS 和 Linux 上编译。 我创建了以下 setup.py 文件:

from distutils.core import setup, Extension

module1 = Extension('car_mechanic',
                    extra_compile_args=["-std=c++11"],
                    sources=['car_mechanic_py.cpp', 'png_parse.cpp', 'car_parse.cpp', 'lodepng.cpp', 'logger.cpp'
                             , 'lzfse/src/lzfse_fse_py.c', 'lzfse/src/lzfse_decode_py.c', 'lzfse/src/lzfse_encode_py.c'
                            , 'lzfse/src/lzfse_decode_base_py.c', 'lzfse/src/lzfse_encode_base_py.c'
                            , 'lzfse/src/lzvn_decode_base_py.c', 'lzfse/src/lzvn_encode_base_py.c'])

setup(name='car_mechanic',
       version='1.0',
       description='This package parses and changes the Asset.car ios apps use',
       ext_modules=[module1])

然后用python setup.py build

这个解决方案有两个问题:

  • -std=c++11 标志不适用于 MacOS 下的 .c 文件,因为它运行不支持它的 clang。它还在 Linux 上发出警告
  • 对于 lzfse 库中的每个 .c 文件,我需要添加一个 #include <python2.7/Python.h>。由于我不想更改原始文件,因此我为每个 lsfse_XXX.c 创建了一个 lzfse_XXX_py.c 文件,它仅:

#include <python2.7/Python.h> #include "lzfse_XXX.c"

有没有更好的方法将 lzfse 变成我的 python 包使用的库? Setuptools 能解决我的问题吗?

【问题讨论】:

标签: python setuptools setup.py distutils python-packaging


【解决方案1】:

使用@phd 的回答:

git clone --recursive https://github.com/dimkr/pylzfse
cd pylzfse
python setup.py build

从我的模块中删除所有 lzfse 文件,然后复制到 lzfse.so 并在导入我的模块之前导入

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    相关资源
    最近更新 更多