Имам голям C/C++ проект, който обикновено просто изграждам като самостоятелен изпълним файл. Освен това изисква някои библиотеки (системни библиотеки като pthread, но също и MKL от intel например), които посочвам при компилирането на проекта.
Сега искам да използвам някои функции от този проект в Python. Така че първият ми план беше просто да създам проекта като статична библиотека и след това да я използвам, за да напиша обвивка на cython. т.е.
Създайте c проекта:
icc -c src/main.cpp .. options and stuff.. linking to all libraries needed .. -o main.o
Създайте статична библиотека (включително библиотеките, от които се нуждаех в стъпка 1):
ar -rc libmain.a main.o ${MKLROOT}/lib/intel64/libmkl_intel_lp64.a ... /usr/lib/x86_64-linux-gnu/libpthread.a ...
Използвам генерираната статична библиотека, за да създам моята обвивка на cython
когато се опитам да изпълня тестов скрипт на python, извикващ произволна функция от моята C програма, получавам тази грешка
ImportError: /home/.../main.cpython-37m-x86_64-linux-gnu.so: undefined symbol: __kmpc_ok_to_fork
Изглежда, че трябва да кажа на cython да се свърже отново със съответните библиотеки или нещо подобно, но не съм много сигурен как да разреша това. Също така не искам проектът на python да зависи от някои специални библиотеки, които имам инсталиран на моята система (това се опитвам да постигна чрез добавяне на всички библиотеки в стъпка 2), възможно ли е това изобщо?
Моят setup.py изглежда така
from setuptools import setup, Extension
from Cython.Build import cythonize
import os
os.environ["CC"] = "icc"
os.environ["CXX"] = "icc"
setup(
ext_modules = cythonize([Extension("test", ["test.pyx"], language="c++",
library_dirs=[r'.'], libraries=['main'])])
)
__kmpc_ok_to_fork
е вlibiomp5
. Можете ли да опитате да добавите iomp5 към библиотеките? - person brm   schedule 18.05.2021