这是一个我不知道从哪里开始的区域。 我正在尝试编译使用G3Dlite的二进制文件。 我已经遇到过一个未定义的“__decl”我必须定义,因为platform.h中没有定义。 之后,编译器停止了此错误:
./dep/include/g3dlite/G3D/AtomicInt32.h:124:44: error: impossible constraint in ‘asm’
第124行在此功能中:
/** Returns zero if the result is zero after decrement, non-zero otherwise.*/
int32 decrement() {
#if defined(G3D_WIN32)
// Note: returns the newly decremented value
return InterlockedDecrement(&m_value);
#elif defined(G3D_LINUX) || defined(G3D_FREEBSD)
unsigned char nz;
asm volatile ("lock; decl %1;\n\t"
"setnz %%al"
: "=a" (nz)
: "m" (m_value)
: "memory", "cc");
return nz;
#elif defined(G3D_OSX)
// Note: returns the newly decremented value
return OSAtomicDecrement32(&m_value);
#endif
}
我不确定linux上的问题是什么。这个代码在其他平台上检查并编译得很好,所以我想知道这是g3d代码还是本地操作系统的问题。
arcemu@raspberrypi ~ $ uname -a && gcc --version && cmake --version
Linux raspberrypi 3.1.9+ #168 PREEMPT Sat Jul 14 18:56:31 BST 2012 armv6l GNU/Linux
gcc (Debian 4.6.3-8+rpi1) 4.6.3
cmake version 2.8.9-rc1
我已经阅读了一些相关的帖子,这些帖子似乎表明“修改”的内容不再受支持了。
有人能指出一个开始排除故障的好地方吗?
感谢。
答案 0 :(得分:4)
输出约束指定x86寄存器(EAX),这在arm cpu上是不可能的。此外,锁定前缀是特定于x86的平台,并且arm上也不支持decl和setnz指令。
这是输出约束:
: "=a" (nz)
告诉gcc使用寄存器eax来保存结果,然后将其复制到变量 nz 。