sscanf + c99 не работает на некоторых платформах? - PullRequest
1 голос
/ 07 апреля 2010

Когда я собираю простой Hello World! Программа, которая использует функцию sscanf на моем локальном Debian lenny x64, работает. Но когда я загружаю ту же программу на сервер под управлением CentOS x86, она не будет работать. Если я не использую sscanf, то программа работает на обоих компьютерах.

gcc -std = c99 -O2 -pipe -m32

Если я скомпилирую его с помощью sscanf, но без -std = c99, он будет работать на обоих компьютерах.

gcc -O2 -pipe -m32

В чем проблема с sscanf и c99 на CentOS x86? Я думал, что компиляция с флагом -m32 будет работать на всех Linux? (У меня ограниченный доступ к серверу CentOS, поэтому у меня нет доступа к сообщениям об ошибках.)

Ответы [ 5 ]

6 голосов
/ 06 августа 2010

Вероятно, в коробке CentOS используется старая версия glibc. Поскольку нестандартные расширения GNU для их реализации scanf закончились конфликтом glibc с c99, они добавили неприятный хак перенаправления *scanf в __isoc99_*scanf, когда используется -std=c99; если в вашей копии glibc отсутствует символ __isoc99_sscanf, программа не сможет запуститься.

Статическая ссылка или ссылка на другой libc без уродливых хаков обратной совместимости решит проблему.

1 голос
/ 08 апреля 2010

Вы загружаете бинарный файл или исходный код и затем перекомпилируете? Если вы загружаете двоичный файл, вы, вероятно, столкнулись с проблемой совместимости библиотек между Debian и CentOS.

В этом случае загрузите только исходный код и перекомпилируйте в CentOS.

0 голосов
/ 19 апреля 2011

Вам нужно обновить 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-разви-2.7-2.x86_64.rpm

Glibc-2.7-2.x86_64.rpm

Команда:

об / мин -Uvh --aid --nodeps glibc-common-2.7-2.x86_64.rpm

об / мин -Uvh --aid --nodeps glibc-headers-2.7-2.x86_64.rpm

об / мин -Uvh --aid --nodeps glibc-devel-2.7-2.x86_64.rpm

об / мин -Uvh --aid --nodeps glibc-2.7-2.x86_64.rpm

0 голосов
/ 31 марта 2011

Я столкнулся с подобной проблемой, она работает @ Ubuntu 64-bit, но компиляция не удалась @ CenseOS 64-bit (REHL5 desktop):

сообщение об ошибке:

undefined reference to `__isoc99_sscanf@GLIBC_2.7'

когда я скопировал исполняемый файл, скомпилированный @Ubuntu в REHL5, и запустил его, появилась другая ошибка:

elf file os abi invalid

он скомпилирован без флага -std = c99, я новичок в C и ищу слово обходные пути, напр. добавить флаг.

Makefile:

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
0 голосов
/ 07 мая 2010

Если у вас нет разрешения на компиляцию @ CentOS, попробуйте скомпилировать статический двоичный файл. Вы можете использовать dietlibc, который делает бинарные файлы меньшего размера, чем glibc, или попробовать EGLIBC, которая является библиотекой C по умолчанию, которую Debian будет использовать при запуске Debian "squeeze".

...