Короткий ответ: я слишком рано поставил аргумент -l
в команде компиляции.Также важно обрабатывать путь поиска в библиотеке.Самый простой способ - использовать rpath
.Я установил rpath
в каталог, в котором находится исполняемый файл, т. Е. .
. Кроме того, необходимо установить связь с библиотеками python и задать пути включения и пути к библиотекам.Их можно определить во время компиляции, используя выходные данные утилиты python-config
.Вот команда компиляции, которая в конечном итоге добилась цели:
g++ cpp_test.cpp -o cpp_test -L. -l:cymod.so $(python-config --libs) $(python-config --includes) $(python-config --cflags) -Wl,-rpath,"\$ORIGIN"
Я также обновил файл c ++ до #include "Python.h"
и добавил вызовы к Py_Initialize()
, Py_Finalize()
и initcymod()
:
#include <iostream>
#include "Python.h"
#include "cymod.h"
int main(int argc, char *argv[])
{
Py_Initialize();
initcymod();
std::cout << simple_echo("test") << std::endl;
Py_Finalize();
return 0;
}
ПРИМЕЧАНИЕ: вызов initcymod()
необходим, но зависит от python2.На python3 вы должны позвонить PyImport_AppendInittab("cymod", PyInit_cymod);
до Py_Initialize()
.cymod
часть - это имя модуля, замените имя вашего модуля.
Спасибо @ead за информативную ссылку на документы по этой теме https://cython.readthedocs.io/en/latest/src/userguide/external_C_code.html#using-cython-declarations-from-c и его ответ на связанный вопрос https://stackoverflow.com/a/45424720/2069572
Читая связанные документы, я наткнулся на следующее:
Примечание. В некоторых операционных системах, таких как Linux, также возможно сначала создать расширение Cython обычным способом изатем ссылка на полученный .so-файл, как динамическая библиотека.Остерегайтесь, что это не переносимо, поэтому его следует избегать.
Так что получается, что вы не должны делать то, что я пытался сделать.
Вместо того, что я должен был иметьсделано было выполнено:
cython --cplus cymod.pyx
и затем скомпилировано cpp_test.cpp
с созданным файлом cymod.cpp
.Нет необходимости связывать разделяемую библиотеку Cython, и оказывается, что это не очень хорошая идея.