Size_t не может быть найден g++ - 4.1 или другими на Ubuntu 8.1

Это случилось раньше, но я не могу вспомнить, как я его исправил.

Я не могу скомпилировать некоторые программы здесь, на новой установке Ubuntu... Что-то не так с моими заголовками.

Я пробовал g++ - 4.1 и 4.3 безрезультатно.

g++ -g -frepo  -DIZ_LINUX -I/usr/include/linux -I/usr/include -I/include  -c qlisttest.cpp
/usr/include/libio.h:332: error: ‘size_t’ does not name a type
/usr/include/libio.h:336: error: ‘size_t’ was not declared in this scope
/usr/include/libio.h:364: error: ‘size_t’ has not been declared
/usr/include/libio.h:373: error: ‘size_t’ has not been declared
/usr/include/libio.h:493: error: ‘size_t’ does not name a type
/usr/include/stdio.h:294: error: ‘size_t’ has not been declared
...

файл...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
...



@ubuntu:~/work/zpk/src$ cat /usr/include/linux/types.h | grep size_t
typedef __kernel_size_t    size_t;
typedef __kernel_ssize_t   ssize_t;

types.h определенно находится на пути, и его подбирают. Я проверил, изменив имя файла и получив ошибку в его отсутствии...

Есть ли у кого-нибудь идеи...? Я очень благодарен за помощь...

Ответ 1

Начните с удаления -I/usr/include/linux и -I/usr/include. Добавление системных каталогов для включения путей вручную либо не имеет никакого эффекта, либо ломает вещи. Кроме того, удалите -frepo для дополнительной безопасности.

Ответ 2

Трудно сказать, в чем проблема, не видя полного источника. Лучшим способом отладки таких проблем является использование параметра g++ "-E" для получения результата перед процессором, а затем посмотрите на это, чтобы выяснить, что происходит в ваших включениях. Здесь информация о g++ info о "-E":

-E Остановка после этапа предварительной обработки; не запускайте собственно компилятор.     Вывод выполнен в виде предварительно обработанного исходного кода, который     отправляется на стандартный вывод.

Кроме того, почему бы просто не включить sys/types.h в начало файла?

Приложение:

В моей системе я создал короткий файл с именем foo.cc, который содержит только:

#include <time.h>

И затем я запустил:

g++ -E/tmp/foo.cc > /tmp/foo.pp

Очень важно смотреть на этот вывод очень подробно. Например, я узнал, что /usr/include/bits/types.h имеет typedef для __time_t, и что /usr/include/types.h затем использует этот typedef, чтобы сказать "typedef __time_t time_t". Но есть интересные другие макросы, окружающие это определение. Обратите особое внимание на такие вещи, как макрос "__BEGIN_NAMESPACE_STD" в /usr/include/time.h, который в моей системе кажется пустым. Но я могу представить себе, что некоторые другие системы могут иметь другое значение для этого макроса, заставляя определение time_t в каком-то другом пространстве имен.

Прочтите информационную страницу Cpp, раздел "Выход препроцессора 9", который определяет формат строк файла. Особо следует отметить раздел о:

Имя исходного файла и информация о номере строки передаются строками формы

# FLENN FILENAME FLENS

И затем далее описывается "FLAGS", которые представляют интерес для этого уровня отладки.

Ответ 3

Как правило, вы не должны использовать C.h файлы для С++. В то время как вы можете найти простой способ избежать этого, и в то время как многое из этого было разрешено в предыдущих версиях g++ и других компиляторах, стандарт С++ определяет size_t, который находится в cstddef (см. Раздел 18.2/таблица 17). g++ только стал более строгим.

Удалите все входящие пути, которые вы добавили в свою команду (они избыточны), и добавьте в начало исходного кода, если они не включены:

#include <cstddef>
using namespace std;

Ответ 4

Установлен ли пакет сборки?

sudo apt-get install build-essential

Ответ 5

Забыл следить за этим. Оказывается, что /usr/include не может быть включен в /usr/include/linux на этом конкретном дистрибутиве. size_t похоже, будет уничтожен вторым включением.

Мои включения теперь просто /usr/include, и он отлично работает.

-I/usr/include -I/usr/include/ace -I/usr/lib/glib-2.0/include -I/usr/include/glib-2.0...

Вытащить все входящие и воспроизвести с ними исправленные.

Ответ 6

Он должен быть в stddef.h или cstddef. types.h не является стандартной библиотекой, и я считаю, что это относится к типам, которые требуется ОС.