SWIG方法/类命名约定跨平台是否不同?

2024-09-26 22:07:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用CWIG方法(SigiguAddLoad,Link库)为SIP提供C++共享库的Python绑定。你知道吗

所有的头文件只包含在一个mymodule.i文件中。你知道吗

在Ubuntu上一切正常,所有的类和方法都正确生成。你知道吗

在Windows上(使用MSVC和MinGW编译器)不会生成类。你知道吗

我试图将%include<;windows.I>;添加到mymodule.I接口文件,但它没有更改任何内容。在某个时刻,我试图设置cmake策略CMP0078(但它对此没有任何影响)。你知道吗

我在Windows上得到了.pyd文件,但它没有正确生成。不知道编译器之间有什么区别-或者我遗漏了什么小东西。你知道吗

例如,我们有: 类设备: 方法:getName() getDescription() 类缓冲区: 方法:getLength() 设置长度(int)

编译之后,如果我们在Ubuntu中使用python帮助(模块/类)功能,我们将得到预期的结构:

 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

Tags: 方法nameprojectcmakesourceincludedevicewindows

热门问题