Я пытаюсь создать привязки Python для общей библиотеки C ++ с помощью SWIG, используя подход CMake (swig_add_library, link_libraries).
Все заголовки включены только в один файл mymodule.i.
В Ubuntu все работает нормально, все классы и методы генерируются правильно.
В Windows (как с компиляторами MSVC, так и MinGW) классы не генерируются.
Я пытался добавить% включают в файл интерфейса mymodule.i, но это ничего не меняет.В какой-то момент я попытался установить политику cmake CMP0078 (но это никак не влияет на это).
Я получаю файл .pyd в Windows, но он генерируется неправильно.Не могу понять, в чем разница между компиляторами - или какие мелочи мне не хватает.
Например, у нас есть: класс Device: method: getName () getDescription () класс Buffer: method: getLength() setLength (int)
После компиляции, если мы будем использовать функциональность справки (модуля / класса) Python в Ubuntu, мы получим ожидаемую структуру:
help(mymodule)
NAME mymodule
CLASSES Device Buffer etc.
help(Device)
class Device(object):
Methods:
getName(...)
getDescription(...)
etc..
Однако в Windows:
help(mymodule)
NAME mymodule
FUNCTIONS Device_getName(...)
Device_getDescription(...)
Buffer_getLength(...)
etc
help(any Device/Buffer object)
class SwigPyObject(object)
none of the defined methods are in here
Существует ли какое-либо соглашение о вызовах / именах, которое SWIG использует в Linux и Windows?Почему все имена методов имеют префикс имени класса?
Редактировать:
Это конфигурация cmake:
FIND_PACKAGE(SWIG REQUIRED)
include(UseSWIG)
FIND_PACKAGE(PythonLibs)
find_package(PythonInterp REQUIRED)
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH}
${CMAKE_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR})
SET(CMAKE_SWIG_FLAGS "")
SET_SOURCE_FILES_PROPERTIES(${PROJECT_NAME}.i PROPERTIES CPLUSPLUS ON)
set(CMAKE_SWIG_OUTDIR ${CMAKE_CURRENT_BINARY_DIR})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
set_property(SOURCE ${PROJECT_NAME}.i PROPERTY SWIG_MODULE_NAME "libm2k")
SWIG_ADD_LIBRARY(${PROJECT_NAME} TYPE SHARED LANGUAGE python SOURCES ${PROJECT_NAME}.i)
target_include_directories(_${PROJECT_NAME} PRIVATE
${PYTHON_INCLUDE_DIRS}
${CMAKE_SOURCE_DIR}/include)
target_link_libraries(_${PROJECT_NAME} ${PROJECT_NAME} ${PYTHON_LIBRARIES})
Это конфигурация экспорта библиотеки:
#ifdef _WIN32
#ifdef LIBM2K_EXPORTS
#define LIBM2K_API __declspec(dllexport)
#else
#define LIBM2K_API __declspec(dllimport)
#endif
#else
#define LIBM2K_API __attribute__((visibility ("default")))
#endif