当我编译一个简单的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服务器的访问权限有限,因此我无法访问错误消息。)
答案 0 :(得分:6)
可能CentOS盒子使用旧版本的glibc。由于他们的scanf实现的非标准GNU扩展最终使glibc与c99发生冲突,因此当*scanf
正在使用时,他们添加了一个令人讨厌的黑客,将__isoc99_*scanf
重定向到-std=c99
;如果您的glibc副本缺少__isoc99_sscanf
符号,则程序将无法运行。
静态链接或链接到不同的libc而没有丑陋的向后兼容性黑客,可以解决问题。
答案 1 :(得分:1)
您是上传二进制文件还是源代码然后重新编译?如果要上传二进制文件,可能会遇到Debian和CentOS之间的库兼容性问题。
如果是这种情况,请仅上传源代码并在CentOS上重新编译。
答案 2 :(得分:0)
如果您没有编译@ CentOS的权限,请尝试编译静态二进制文件。你可以使用dietlibc制作比glibc更小的二进制文件,或者尝试使用EGLIBC,它是Debian将使用Debian“squeeze”的默认C库。
答案 3 :(得分:0)
我想出了类似的问题,它运行@ Ubuntu 64位,但编译失败@CenseOS 64位(REHL5桌面):
错误信息是:
undefined reference to `__isoc99_sscanf@GLIBC_2.7'
当我将编译后的@Ubuntu的可执行文件复制到REHL5并运行它时出现了另一个错误:
elf file os abi invalid
它是在没有标志-std = c99的情况下编译的,我是C的新手,并且寻找一些解决方法,例如。添加一些标志。
生成文件:
CC=gcc
CCFLAGS= -Wall -O2 -DLINUX -I../include
demos:linuxdemo.c
$(CC) $(CCFLAGS) -o demoA linuxdemo.c -L../lib -lsense4 -lusb
$(CC) $(CCFLAGS) -o demoSO linuxdemo.c -lusb -lsense4
clean:
rm -f demoA
rm -f demoSO
答案 4 :(得分:-1)
您需要将glibc更新为2.7
从这里下载rpm包: http://archive.fedoraproject.org/pub/archive/fedora/linux/releases/8/Everything/x86_64/os/Packages/
需要:
的libc-共2.7-2.x86_64.rpm
的glibc报头-2.7-2.x86_64.rpm
的glibc-devel的-2.7-2.x86_64.rpm
的glibc-2.7-2.x86_64.rpm
命令:
rpm -Uvh --aid --nodeps glibc-common-2.7-2.x86_64.rpm
rpm -Uvh --aid --nodeps glibc-headers-2.7-2.x86_64.rpm
rpm -Uvh --aid --nodeps glibc-devel-2.7-2.x86_64.rpm
rpm -Uvh --aid --nodeps glibc-2.7-2.x86_64.rpm