Добавление библиотеки C в проект C ++ 11 distutils - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть проект на 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 flag не работает для. c файлов под MacOS, так как работает clang, который его не поддерживает. Также выдается предупреждение о Linux
  • Для каждого. c файла из библиотеки lzfse, мне нужно было добавить #include <python2.7/Python.h>. Так как я не хотел изменять исходные файлы, я создал файл lzfse_XXX_py.c для каждого lsfse_XXX.c, что делает только:

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

любым лучшим способом превратить lzfse в библиотеку, используемую моим пакетом python? Решат ли Setuptools мои проблемы?

1 Ответ

0 голосов
/ 19 февраля 2020

используя ответ @ phd:

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

удалил все файлы lzfse из моего модуля, затем скопировал их в lzfse.so и импортировал перед импортом моего модуля

...