Заголовочные файлы без .h в C ++ - PullRequest
4 голосов
/ 16 июля 2010

У меня проблемы с включением стандартных заголовочных файлов, таких как iostream.h и fstream.h. В моей системе под usr/include/c++/4.3 ни один из файлов не имеет расширения ".h" (например, это просто iostream , а не iostream.h ).

Это было бы неплохо, но я пытаюсь использовать другую библиотеку, DCMTK, которая выполняет такие вещи, как #include<iostream.h>. К сожалению, в моей системе нет такого понятия, как «iostream.h», только «iostream», что означает, что мой компилятор выдает мне ошибки, подобные error: iostream.h: No such file or directory.

Полагаю, я мог бы создать мягкие ссылки от iostream.h до iostream, но похоже, что это может создать, во-первых, проблемы в будущем, а во-вторых, действительно раздражать. Есть ли другое решение?

Просто для полноты, команда, которую я даю для компиляции:

g++ -o gc_on_ctp -g -Wall -Idicom/include -Ldicom/lib gc_on_ctp.cpp -ldcmdata

Как вы можете себе представить, заголовочный файл находится в каталоге dicom / include, а библиотека - в каталоге dicom / lib с именем libdcmdata.a.

Ответы [ 4 ]

7 голосов
/ 16 июля 2010

Я бы посоветовал вам посмотреть здесь .Это объясняет, почему и когда родился этот iostream.h / iostream, почему он существует и как вы должны решить эти проблемы.

В основном iostream.h следует считать УСТАРЕЛО Ненадежный и ОСОБЕННОСТИ ОСУЩЕСТВЛЕНИЯ и использование iostream вместо этого может вызвать ошибки ..

6 голосов
/ 16 июля 2010

Просто создайте новый файл iostream.h, содержащий одну строку: #include <iostream>.DCMTK кажется большой ошибкой, потому что стандартом является то, что в этих именах файлов не должно быть .h.

3 голосов
/ 16 июля 2010

Эти заголовки устарели / предварительно установлены. На gcc я считаю, что они расположены как #include <backward/iostream.h> и т. Д.

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

1 голос
/ 16 июля 2010

Я бы исправил (устаревшую) библиотеку. Вы можете использовать поиск и замену регулярных выражений по месту:

perl -e "s/iostream.h/iostream/g;" -pi $(find . -iname "*.cpp")

или

find . -iname "*.cpp" -print0 | xargs -0 sed -i 's/iostream.h/iostream/g'

ПРИМЕЧАНИЕ: Будьте осторожны при этом ... это рекурсивно влияет на все файлы по пути, с которого вы начинаете.

...