当我编译一个简单的Hello World!在我的本地Debian lenny x64上使用sscanf函数的程序,它的工作原理.但是当我将相同的程序上传到运行CentOS x86的服务器时,它将无法正常工作.如果我不使用sscanf,那么该程序可以在两台计算机上运行.
gcc -std = c99 -O2 -pipe -m32
如果我用sscanf但没有-std = c99编译它,那么它适用于两台计算机.
gcc -O2 -pipe -m32
在CentOS x86上使用sscanf和c99有什么问题?我认为使用-m32标志进行编译会对所有Linux都有效吗?(我对CentOS服务器的访问权限有限,因此我无法访问错误消息.)
可能CentOS盒子使用旧版本的glibc.由于他们的scanf实现的非标准GNU扩展最终导致glibc与c99冲突,他们添加了一个令人讨厌的黑客重定向*scanf
到__isoc99_*scanf
何时-std=c99
使用; 如果您的glibc副本缺少__isoc99_sscanf
符号,则程序将无法运行.
静态链接,或链接到不同的libc没有丑陋的向后兼容性黑客,将解决问题.