Как скомпилировать Cython с помощью C++ для получения файлов общих объектов (*.so)

Я работаю над некоторым кодом Cython, который использует некоторые структуры данных стандартной библиотеки С++, и я могу скомпилировать код для получения файлов *.cpp. Я делаю это, используя distutils со скриптом установки (см. код). Однако прямо сейчас я не могу создавать файлы *.so, и я не знаю, почему. Прежде чем мне понадобились какие-либо структуры данных C++, сценарий установки мог генерировать файлы *.so и файлы *.c. Теперь он просто генерирует файлы *.cpp, и я не могу импортировать их в остальные свои скрипты Python.

Мой сценарий установки был создан в соответствии с этой документацией: https://cython.readthedocs.io/en/latest/src/userguide/source_files_and_compilation.html

Дополнительные аргументы компиляции и языковые аргументы позволяют компилировать Cython, который включает C++.

from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension
import numpy

extensions=[
    Extension("mesh",
              sources=["optimized_mesh.pyx"],
              include_dirs=[numpy.get_include()],
              language="c++",
              extra_compile_args=["-stdlib=libc++"])
]

setup(
    ext_modules=cythonize(extensions)
)

Я ожидаю, что на выходе будут файлы *.cpp и *.so, но пока я могу получить только файл *.cpp.

РЕДАКТИРОВАТЬ:

Я выяснил, что происходит, первый аргумент в Extension — это имя создаваемого общего объектного файла. Я искал общие объектные файлы с именами источников.


person user1746082    schedule 15.06.2019    source источник
comment
Выход чего? Какая была команда?   -  person phd    schedule 16.06.2019
comment
Может быть, попробуйте добавить -fPIC -shared для компиляции тегов, так вы обычно компилируете общую библиотеку.   -  person AdamTL    schedule 16.06.2019
comment
Показанный код находится в сценарии с именем setup.py, а команда — «python setup.py build_ext --inplace».   -  person user1746082    schedule 16.06.2019
comment
@AdamTL Я пытался добавить -fPIC -shared в файл setup.py, но безуспешно.   -  person user1746082    schedule 16.06.2019


Ответы (1)


Первый аргумент в Extension определяет имя общего объекта, который будет создан. При наличии нескольких источников для компиляции отдельные общие объектные файлы не будут создаваться для каждого из этих источников, хотя будут созданы отдельные файлы *.c или *.cpp.

person user1746082    schedule 16.06.2019