Вы вызываете функцию C ++, в то время как ctypes
ожидает связывания функций C:
- Функции C имеют другое (т.е. ни одного) искажение имени, как вы заметили
- Функция C не может иметь параметры C ++ (объекты std, такие как std :: vector, ссылки и т. Д.)
Чтобы решить вашу проблему, объявите чистый API-интерфейс в стиле C в ваших заголовках, и если вы собираетесь реализовать функции в C ++ и использовать g ++ в качестве компилятора / компоновщика, вы должны добавить объявление extern "C"
прямо перед функцией объявление в заголовочном файле или в виде блока вокруг ваших объявлений:
extern "C" void print_array(...);
Это предотвратит искажение имени в C ++.
Использование векторов и других типов C ++ в функциях интерфейса вызовет проблемы с ABI, т.е. е. «это не сработает», даже если все ссылки и компиляции выглядят чисто.
Используйте функции C с типами данных, поддерживаемыми ctypes (см. Документы Python по ctypes ), в своих функциях в качестве интерфейса, не стесняйтесь реализовать в C ++, но затем оберните объявления функций C в extern "C"
блок для предотвращения искажения имени.
Пожалуйста, обратитесь к документации по ctypes, чтобы узнать, как правильно использовать структуры, объединения, ссылки и т. Д. В качестве параметров функций, так как есть много подводных камней и проблем, которые необходимо учитывать.