0

我正在尝试使用 Visual Studio 2010 中的 swig 生成一个 dll 文件,我成功创建并编译了我的 wrapper.cpp 代码,并将每个库依赖项添加到我的项目中。现在,当我尝试使用 .dll 目标扩展名构建项目的发布版本时,出现以下错误:

  Generating non-SAFESEH image.
1>Ccrypto_wrap.obj : error LNK2019: unresolved external symbol "int __cdecl axtoi(char const *)" (?axtoi@@YAHPBD@Z) referenced in function __wrap_axtoi

这是有线的,因为 wrapper.cpp 中的所有其他外部符号都已解决,除了

axtoi!我的意思是,例如在我的 wrapper.cpp 中,我有 2 个引用axtoi

(1)

ZEND_NAMED_FUNCTION(_wrap_axtoi) {   char *arg1 = (char *) 0 ;   zval
**args[1];   int result;
     SWIG_ResetError();   if(ZEND_NUM_ARGS() != 1 || zend_get_parameters_array_ex(1, args) != SUCCESS) {
    WRONG_PARAM_COUNT;   }

      /*@SWIG:C:\Users\user\Desktop\Ccrypto\Lib\php\utils.i,62,CONVERT_STRING_IN@*/
      if ((*args[0])->type==IS_NULL) {
        arg1 = (char *) 0;
      } else {
        convert_to_string_ex(args[0]);
        arg1 = (char *) Z_STRVAL_PP(args[0]);
      }
      /*@SWIG@*/;

      result = (int)axtoi((char const *)arg1);
      {
        ZVAL_LONG(return_value,result);
      }
      return;
    fail:
      SWIG_FAIL();
    }

(2)

SWIG_ZEND_NAMED_FE(axtoi,_wrap_axtoi,NULL)

我在 Linux 中成功创建了我的班级的共享对象,并将它包含在我的 php 代码中并且它工作正常,所以我尝试axtoi在 Linux 中签入我的共享对象,我发现了一件奇怪的事情!axtoi当我在我的共享对象中grep 时,我得到:

         U _Z5axtoiPKc
0006ccf1 T _wrap_axtoi

但是对于所有其他符号,例如,它的用法与我在包装器代码中的itoax用法相同:axtoi

00093660 T _Z5itoaxi
0006e19f T _wrap_itoax

我有几个类似的符号,它们的使用与上面提到的 wrapper.cpp 代码中的完全相同axtoi,但是我没有得到任何未解决的外部符号错误。有任何想法吗?

4

1 回答 1

0

我找到了答案:似乎 C++ 选项调用axtoi()函数而不是atoi()函数中的 swig 包装器代码生成器。需要在 SWIG 生成的 wrapper.cpp 中进行编辑,然后错误解决。

于 2012-09-30T13:36:37.003 回答