Python 无法生成Cython扩展

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

我正在尝试使用Cython构建具有以下项目结构的python扩展:

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文件后,它将正常工作。