Являются ли соглашения о присвоении имен методам / классам SWIG кросс-платформенными? - PullRequest
3 голосов
/ 09 мая 2019

Я пытаюсь создать привязки 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
...