Swig在Windows的调试模式下使用连字符定义SWIG | 您所在的位置:网站首页 › c2059错误解决办法 › Swig在Windows的调试模式下使用连字符定义SWIG |
在Windows上,我使用cmake、swig和visual studio为我的库构建了一个python Package 器。在Release模式下,一切正常。在Debug中,生成的代码包含以下行: #define SWIG_init PyInit__myproject-gd所以Debug追加了Release中没有的-gd。构建继续使用该符号作为函数名,这是无效的C++,因为标识符中不允许使用连字符。因此这一行... SWIG_init(void) {...导致生成失败,并显示以下错误消息: C:\xxx\myprojectPYTHON_wrap.cxx(807935,1): error C2143: syntax error: missing ';' before '-' C:\xxx\myprojectPYTHON_wrap.cxx(807935,1): error C2059: syntax error: '-' C:\xxx\myprojectPYTHON_wrap.cxx(807935,17): error C2143: syntax error: missing ';' before '{' C:\xxx\myprojectPYTHON_wrap.cxx(807935,17): error C2447: '{': missing function header (old-style formal list?)我该怎么解决这个问题? 编辑: 在发行版中,cmake发出的swig命令包括: -interface _myproject对于debug,它说: -interface _myproject-gd所以在swig自动生成的c++代码中,我在release中得到了一个名为_myproject的函数,但在debug中得到了_myproject-gd。在此文件中: C:\Program Files\CMake\share\cmake-3.26\Modules\UseSWIG.cmake我看到: # This makes sure that the name used in the proxy code # matches the library name created by CMake list (APPEND SWIG_MODULE_${name}_EXTRA_FLAGS "-interface" "$$")我已经调试了那个cmake生成器表达式,当然它在发行版中的计算结果是_myproject,在调试版中的计算结果是_myproject-gd。在此文件中: C:\repos\myproject\cmake\commonSettings.cmake我看到: if("${MSVC_RUNTIME}" STREQUAL "static") set(CMAKE_DEBUG_POSTFIX "gd") else() set(CMAKE_DEBUG_POSTFIX "-gd") endif()删除连字符修复了编译错误,但破坏了其他东西。(lib)name,并将其合并到C++函数的名称中。因此,您向该cmake变量添加了连字符,以为您的lib名称将包含连字符,然后你自动生成的swig代码就坏了我可能错了我还在挖。 编辑#2: 我注意到UseSWIG.cmake只在-interface标志还没有被设置的情况下才设置它。 list (APPEND SWIG_MODULE_myproject_EXTRA_FLAGS "-interface" _myproject)...它似乎解决了这个问题.我还不能确定,因为我的构建仍然失败后,什么似乎是一个单独的,无关的问题. |
CopyRight 2018-2019 实验室设备网 版权所有 |