Чтобы скомпилировать его с помощью IPythons-magic (было бы неплохо, если бы вы прямо упомянули об этом в своем вопросе), вам необходимо указать путь к библиотеке (через -L
-опцию) и имя библиотеки (через -l
-опцию) встроенной c-библиотеки, которую вы хотите обернуть, см. также документацию :
%%cython -L=<path to your library> -l=<your_library>
Библиотека, которую вы пытаетесь обернуть, не только для заголовкабиблиотека.Это означает, что некоторые символы (например, mdb_env_create
) только объявлены, но не определены в заголовке.Когда вы создаете библиотеку, определения этих символов можно найти в результирующем артефакте, который должен быть предоставлен компоновщику при сборке вашего расширения.Эти определения необходимы для запуска программы.
Если вы этого не сделаете, в Linux произойдет следующее: Когда построено расширение (*.so
-файл), компоновщик допускает неопределенные символыпо умолчанию - так что этот шаг является «успешным» - но ошибка только откладывается.Когда расширение загружается через import
, Python загружает соответствующий *.so
с помощью ldopen
, и на этом этапе загрузчик проверяет, что определения всех символов известны.Но мы не предоставили определение mdb_env_create
, поэтому загрузчик завершился ошибкой с
неопределенным символом: mdb_env_create
Это другое для символов, которые определены взаголовочный файл, например, перечисления MDB_FIRST
& Co - скомпилированная библиотека не нужна, и, следовательно, расширение может быть загружено, так как нет неопределенных символов.