Как заставить SWIG использовать 64-битное целое число для intptr_t в Windows
Я хотел бы использовать SWIG на Windows для создания 64-битных приложений. У меня есть класс, в котором есть указатель на буфер, и, поскольку я хотел бы взаимодействовать с классом.NET, указатель объявлен как intptr_t
,
Проблема в том, что стандарт SWIG stdint.i
предполагает, что intptr_t
либо int
(в 32-битной среде) или long
(в 64-битной среде). Хотя это верно для Unix, это неверно для Windows. У кого-нибудь есть подобный опыт или какие-либо идеи, как создать обходной путь для этого?
Я уже настроил наборы, необходимые для intptr_t
=> IntPtr
преобразования, и он работает нормально в 32-битной среде, но он усекает указатель в 64-битной среде.
1 ответ
Хорошо, я отвечу на свой вопрос. Кажется, что это ошибка в SWIG на Windows, что он лечит long
как int64
на 64-битной Windows, хотя на самом деле это int32
, Подробнее об этом читайте здесь: Каков размер long в 64-битной Windows?
Другая проблема с SWIG заключается в том, что он различает 32- и 64-битный код, но причина, по которой я использовал intptr_t
чтобы избежать проблем с разрядностью, так как по определению он дает целое число, достаточно большое, чтобы содержать указатель.
Итак, в конце я написал сценарий, который я запускаю после генерации оболочки для исправления сигнатур типов из int
в intptr_t
, Хотя это не элегантно, я уже должен сделать это по другим причинам для моих оболочек Python и PHP.