python — неопределенные символы в оболочке Cython C ++

У меня есть работа cpp проект, который хорошо строится с cmake, Теперь мне нужно создать оболочку Python для того же. Поэтому я выбрал cython преодолеть разрыв между C++ а также Python,

Вместо написания CMakeLists.txt логика в pyx файл, я попытался скомпилировать библиотеку с cmake сам, а затем обернуть вокруг него оболочку Cython. Ниже приводится setup.py файл:

import os
import sys

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonizetry:
build_dir = os.path.join(os.getcwd(), "build")
print("building bobcore.a")
if not os.path.exists(build_dir):
os.makedirs(build_dir)
if not os.path.exists(build_dir):
raise Exception("Not able to create `build` directory")

os.chdir(build_dir)
assert os.system("cmake ..") == 0
assert os.system("make -j4") == 0
os.chdir(os.path.abspath(os.path.join(os.getcwd(), os.pardir)))
except:
if not os.path.exists("build/bobcli"):
print("Error building external library, please create libsample.a manually.")
sys.exit(1)

_ext_modules = cythonize([
Extension("call_core",
sources=["call_core.pyx"],
language="c++",
extra_compile_args=["-std=c++11", "-lpthread", "-lz", "-ldl"],
extra_link_args=["-std=c++11"],
include_dirs=[os.path.join(os.getcwd(), "src")],  # path to .h file(s)
library_dirs=[os.path.join(os.getcwd(), "build")],  # path to .a or .so file(s)
libraries=["bobcli"] # name of pre-built .so file.
)
])

setup(
name='Demos',
ext_modules=_ext_modules,
)

Здесь call_core.pyx файл:

cdef extern from "src/api/Api.h" namespace "cli":
cdef cppclass Api:
int getVal()cdef Api *api = new Api()

def getHelp():
return api.getVal()

del api

Теперь этот файл работает нормально, если я реализую getVal() метод в самом файле заголовка. Но как только я перенесу реализацию в .cpp файл, компилятор Cython показывает следующую ошибку:

Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: /usr/local/lib/python2.7/dist-packages/call_core.so: undefined symbol: _ZN3cli9Api6getValEv

ПРИМЕЧАНИЕ. Вышеприведенные фрагменты отлично работают для функций с их реализацией в .h файлы.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …