Ответ 1
Начните с удаления -I/usr/include/linux и -I/usr/include. Добавление системных каталогов для включения путей вручную либо не имеет никакого эффекта, либо ломает вещи. Кроме того, удалите -frepo для дополнительной безопасности.
Это случилось раньше, но я не могу вспомнить, как я его исправил.
Я не могу скомпилировать некоторые программы здесь, на новой установке 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 определенно находится на пути, и его подбирают. Я проверил, изменив имя файла и получив ошибку в его отсутствии...
Есть ли у кого-нибудь идеи...? Я очень благодарен за помощь...
Начните с удаления -I/usr/include/linux и -I/usr/include. Добавление системных каталогов для включения путей вручную либо не имеет никакого эффекта, либо ломает вещи. Кроме того, удалите -frepo для дополнительной безопасности.
Трудно сказать, в чем проблема, не видя полного источника. Лучшим способом отладки таких проблем является использование параметра 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", которые представляют интерес для этого уровня отладки.
Как правило, вы не должны использовать C.h файлы для С++. В то время как вы можете найти простой способ избежать этого, и в то время как многое из этого было разрешено в предыдущих версиях g++ и других компиляторах, стандарт С++ определяет size_t, который находится в cstddef (см. Раздел 18.2/таблица 17). g++ только стал более строгим.
Удалите все входящие пути, которые вы добавили в свою команду (они избыточны), и добавьте в начало исходного кода, если они не включены:
#include <cstddef>
using namespace std;
Установлен ли пакет сборки?
sudo apt-get install build-essential
Забыл следить за этим. Оказывается, что /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...
Вытащить все входящие и воспроизвести с ними исправленные.
Он должен быть в stddef.h или cstddef. types.h не является стандартной библиотекой, и я считаю, что это относится к типам, которые требуется ОС.