Swig在Windows的调试模式下使用连字符定义SWIG 您所在的位置:网站首页 c2059错误解决办法 Swig在Windows的调试模式下使用连字符定义SWIG

Swig在Windows的调试模式下使用连字符定义SWIG

#Swig在Windows的调试模式下使用连字符定义SWIG| 来源: 网络整理| 查看: 265

在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 实验室设备网 版权所有