Python 无法生成Cython扩展
我正在尝试使用Cython构建具有以下项目结构的python扩展:Python 无法生成Cython扩展,python,c++,gcc,cython,setuptools,Python,C++,Gcc,Cython,Setuptools,我正在尝试使用Cython构建具有以下项目结构的python扩展: include/ algorithm/ LessonplanScheduler.hpp src/ LessonplanScheduler.cpp GenAlgorithm.cpp GenAlgorithm.hpp LessonplanGenAlgorithm.cpp LessonplanGenAlgorithm.cpp __init__.py algorithm.p
include/
algorithm/
LessonplanScheduler.hpp
src/
LessonplanScheduler.cpp
GenAlgorithm.cpp
GenAlgorithm.hpp
LessonplanGenAlgorithm.cpp
LessonplanGenAlgorithm.cpp
__init__.py
algorithm.pyx
LessonplanScheduler.pxd
setup.py
setup.py
如下所示:
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
setup(
name='Lessonplan scheduler algorithm',
ext_modules=cythonize(
[
Extension(
name="algorithm",
include_dirs=["./include/algorithm"],
library_dirs=["./src"],
sources=["algorithm.pyx", "algorithm.cpp"],
)
],
language_level=3
),
requires=['Cython'],
)
在运行了python./setup.py build\u ext--inplace
之后,我在项目根目录中得到了build
文件夹,并且algorithm.cpp
也在那里。但是。由于多个定义
错误,因此未生成文件:
Compiling algorithm.pyx because it changed.
[1/1] Cythonizing algorithm.pyx
running build_ext
building 'algorithm' extension
creating build
creating build/temp.linux-x86_64-3.7
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I. -I./include/algorithm -I/usr/local/include/python3.7m -c algorithm.cpp -o build/temp.linux-x86_64-3.7/algorithm.o
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I. -I./include/algorithm -I/usr/local/include/python3.7m -c algorithm.cpp -o build/temp.linux-x86_64-3.7/algorithm.o
creating build/lib.linux-x86_64-3.7
g++ -pthread -shared build/temp.linux-x86_64-3.7/algorithm.o build/temp.linux-x86_64-3.7/algorithm.o -L./src -L/usr/local/lib -lpython3.7m -o build/lib.linux-x86_64-3.7/algorithm.cpython-37m-x86_64-linux-gnu.so
/usr/bin/ld: build/temp.linux-x86_64-3.7/algorithm.o:(.bss+0x0): multiple definition of `__pyx_module_is_main_algorithm'; build/temp.linux-x86_64-3.7/algorithm.o:(.bss+0x0): first defined here
/usr/bin/ld: build/temp.linux-x86_64-3.7/algorithm.o: in function `PyInit_algorithm':
/backend/backend/algorithm/algorithm.cpp:1966: multiple definition of `PyInit_algorithm'; build/temp.linux-x86_64-3.7/algorithm.o:/backend/backend/algorithm/algorithm.cpp:1966: first defined here
collect2: error: ld returned 1 exit status
error: command 'g++' failed with exit status 1
我想,这个问题存在于algorithm.cpp
文件中,因此它可能是由错误的构建配置引起的。我应该怎么做才能解决这个问题?构建项目的最佳方式是什么?如果仔细查看编译输出,您将看到它编译了两次algorithm.cpp
,链接了两次algorithm.o
。通过快速浏览文档,我认为您应该只在源代码下指定.pyx文件。您是对的,但是不带算法的g++cpp
返回另一个错误-未定义的符号回溯(最近一次调用):文件“/main.py”,第2行,在from algorithm.algorithm import run_algorithm importorr:/backend/backend/algorithm/algorithm.cpython-37m-x86_64-linux-gnu.so:未定义符号:_ZTIN11lessonplans12GenAlgorithmE
您可能应该将LessonplanGenAlgorithm.cpp
与其他.cpp文件一起添加回源代码。只是不是算法,谢谢你!添加所有cpp文件后,它将正常工作。