我正试图用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
!我的意思是,例如,在我的包装.cpp中,我有两个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:UsersuserDesktopCcryptoLibphputils.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代码中,它运行良好,所以我尝试在Linux中检查我的共享对象中的axtoi
,我发现了一件奇怪的事情!当我在共享对象中输入axtoi
时,我得到了:
U _Z5axtoiPKc
0006ccf1 T _wrap_axtoi
但对于每一个其他符号,例如CCD_ 5,其用法与包装码中的CCD_
00093660 T _Z5itoaxi
0006e19f T _wrap_itoax
如上所述,我在wrapper.cpp代码中使用了几个与axtoi
完全相同的类似符号,但我没有得到任何未解决的外部符号错误。有什么想法吗?
我找到了答案:c++选项中的swig包装器代码生成器似乎调用了axtoi()
函数而不是atoi()
函数。它需要在SWIG生成的wrapper.cpp中进行编辑,然后解决错误。