python - 将 C 库添加到 c++11 distutils 项目
问题描述
我有一个 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
此解决方案有 2 个问题:
-std=c++11
标志不适用于 MacOS 下的 .c 文件,因为它运行不支持它的 clang。它还在 Linux 上发出警告- 对于 lzfse 库中的每个 .c 文件,我需要添加一个 .c 文件
#include <python2.7/Python.h>
。由于我不想更改原始文件,因此我lzfse_XXX_py.c
为 each 创建了一个文件lsfse_XXX.c
,该文件仅:
#include <python2.7/Python.h>
#include "lzfse_XXX.c"
将 lzfse 转换为我的 python 包使用的库有什么更好的方法吗?Setuptools 能解决我的问题吗?
解决方案
使用@phd 的回答:
git clone --recursive https://github.com/dimkr/pylzfse
cd pylzfse
python setup.py build
从我的模块中删除所有 lzfse 文件,然后复制到 lzfse.so 并在导入我的模块之前导入
推荐阅读
- python - django-select2 公开 ajax 端点供外部使用
- java - Java Regex FileName 不重复
- java - HikariCP 的默认最大池大小
- sql - 查询和子查询优化
- microservices - Zuul 转发错误 - 内部服务器错误 500
- javascript - 将提示设置为只读
- regex - 使用正则表达式匹配单词和斜线 (/) 的第 6 次出现
- liferay - 从 liferay 5.2.3 升级到 liferay 6.2 期间出现 NoSuchFileException
- python-3.x - 带有 UTF-8 字符串的 Python 2.7 literal_eval()
- vba - 使用 access-VBA 上传文件时如何防止“内存不足”错误?