sscanf + c99无法在某些平台上运行?

时间:2010-04-07 19:58:13

标签: c gcc debian centos scanf

当我编译一个简单的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服务器的访问权限有限,因此我无法访问错误消息。)

5 个答案:

答案 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