簡體   English   中英

sscanf + c99在某些平台上不起作用?

[英]sscanf + c99 not working on some platforms?

當我編譯一個簡單的Hello World時! 在我的本地Debian lenny x64上使用sscanf函數的程序,它可以工作。 但是,當我將同一程序上載到運行CentOS x86的服務器時,它將無法正常工作。 如果我不使用sscanf,則該程序可在兩台計算機上工作。

gcc -std = c99 -O2 -pipe -m32

如果我使用sscanf而不是-std = c99進行編譯,則它可以在兩台計算機上使用。

gcc -O2-管道-m32

CentOS x86上的sscanf和c99有什么問題? 我以為使用-m32標志進行編譯將在所有Linux上正常工作? (我對CentOS服務器的訪問權限有限,因此我無權訪問錯誤消息。)

CentOS框可能正在使用舊版本的glibc。 由於對scanf實現的非標准GNU擴展最終使glibc與c99發生沖突,因此當使用-std=c99時,他們添加了一個討厭的技巧,將*scanf重定向到__isoc99_*scanf 如果您的glibc副本缺少__isoc99_sscanf符號,則該程序將無法運行。

靜態鏈接或鏈接到其他libc而沒有難看的向后兼容兼容性黑客,將解決此問題。

您要上傳二進制文件還是源文件,然后重新編譯? 如果要上傳二進制文件,則可能是Debian與CentOS之間存在庫兼容性問題。

如果是這種情況,請僅上傳源代碼並在CentOS上重新編譯。

如果您沒有編譯@ CentOS的權限,請嘗試編譯靜態二進制文件。 您可以使用Dietlibc制作比glibc小的二進制文件,也可以嘗試使用EGLIBC,這是Debian將使用默認的C庫來啟動Debian“ squeeze”。

我想到了類似的問題,它在@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

您需要將glibc更新到2.7

從此處下載rpm軟件包: http : //archive.fedoraproject.org/pub/archive/fedora/linux/releases/8/Everything/x86_64/os/Packages/

需要:

libc-common-2.7-2.x86_64.rpm

glibc-headers-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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM