我在Xcode(4.5.2)中有一个使用Debug配置生成良好的项目。但是,现在我已经切换到构建Release配置,我遇到了一个问题:我的一个内联汇编函数出现错误Invalid symbol redefinition
。用谷歌搜索那个错误信息发现我有几个人得到了编译器错误,但没有关于它的含义的信息。这里的功能,带注释的错误行:LLVM上的内联ASM中的“无效的符号重定义”
inline int MulDivAdd(int nNumber,
int nNumerator,
int nDenominator,
int nToAdd)
{
int nRet;
__asm__ __volatile__ (
"mov %4, %%ecx \n"
"mov %1, %%eax \n"
"mull %2 \n"
"cmp $0, %%ecx \n"
"jl __sub \n"
"addl %%ecx, %%eax \n"
"adc $0, %%edx \n"
"jmp __div \n"
"__sub: \n" // "Invalid symbol redefinition"
"neg %%ecx \n"
"subl %%ecx, %%eax \n"
"sbb $0, %%edx \n"
"__div: \n" // "Invalid symbol redefinition"
"divl %3 \n"
"mov %%eax, %0 \n"
: "=m" (nRet)
: "m" (nNumber),
"m" (nNumerator),
"m" (nDenominator),
"m" (nToAdd)
: "eax", "ecx", "edx"
);
return nRet;
}
我试着__sbt
更换__sub
,因为我认为__sub
可能是一个受保护的名字,但事实并非如此。我不明白为什么这只发生在发布虽然 - 可能是由于优化?
如果你用C编写(使用'int64_t'),你会得到更好的代码。该分支是完全不必要的(它应该是一个符号扩展和添加)。我也对使用带符号数据的无符号乘法指令('mull')感到困扰。虽然对于有问题的程序可能无关紧要,但这可能是一个错误。 –
@StephenCanon那么这个俏皮话是如何与这个问题相关的呢? –