[英]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.