Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Программа на c++ - .configure не находит hash_map  (Прочитано 2732 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн qjmann

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
    • Плагины и модули для ShopCMS, Joomla, VirtueMart
Здравствуйте
Пожалуйста, помогите решить проблему с компиляцией программы http://sourceforge.net/projects/aspseek/
Скрипт configure останавливается с ошибкой:
checking for hash_map... no
checking for ext/hash_map... no
configure: error: ** ERROR: Your system lacks some needed STL header files.
Я нашел файл /usr/include/stlport/hash_map, затем создал директорию /usr/include/ext/ и скопировал туда все файлы /usr/include/stlport/*, но configure все равно говорит checking for ext/hash_map... no
Также не помогло, когда скопировал hash_map в /usr/include/

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Программа на c++ - .configure не находит hash_map
« Ответ #1 : 28 Октября 2010, 15:05:54 »
Верни всё на родину и не занимайся таким копированием. В крайнем случае symlink делай. Зачем тебе stlport нужен тоже не понятно. У них же написанно, что они в разработке используюь STL идущий с g++. Установи пакет build-essential и у тебя должен быть файл /usr/include/c++/4.4/ext/hash_map

Если проблема останится запости что в конце config.log лежит. Нужен текст тестовой порограммы и ошибки компилятора.

Оффлайн qjmann

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
    • Плагины и модули для ShopCMS, Joomla, VirtueMart
Re: Программа на c++ - .configure не находит hash_map
« Ответ #2 : 28 Октября 2010, 15:18:12 »
Установил build-essential, хотя файл /usr/include/c++/4.4/ext/hash_map и до этого у меня был. ./configure все так же останавливается, вот config.log:
configure:5786: checking for hash_map
configure:5796: c++ -E  conftest.C >/dev/null 2>conftest.out
In file included from /usr/include/c++/4.4/backward/hash_map:60,
                 from configure:5792:
/usr/include/c++/4.4/backward/backward_warning.h:28:2: warning: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated.
configure: failed program was:
#line 5791 "configure"
#include "confdefs.h"
#include <hash_map>
configure:5823: checking for ext/hash_map
configure:5833: c++ -E  conftest.C >/dev/null 2>conftest.out
In file included from /usr/include/c++/4.4/ext/hash_map:60,
                 from configure:5829:
/usr/include/c++/4.4/backward/backward_warning.h:28:2: warning: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated.
configure: failed program was:
#line 5828 "configure"
#include "confdefs.h"
#include <ext/hash_map>
Вот кусок файла configure начиная со строки 5780:
hash_in_ext=no
for ac_hdr in hash_map hash_set
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:5786: checking for $ac_hdr" >&5
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 5791 "configure"
#include "confdefs.h"
#include <$ac_hdr>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5796: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
  cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
« Последнее редактирование: 28 Октября 2010, 15:40:55 от qjmann »

Оффлайн MaSsoL

  • Активист
  • *
  • Сообщений: 519
    • Просмотр профиля
Re: Программа на c++ - .configure не находит hash_map
« Ответ #3 : 28 Октября 2010, 15:21:33 »
А может надо установить какой нибудь libstl-dev?
In Console We Trust!

Оффлайн qjmann

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
    • Плагины и модули для ShopCMS, Joomla, VirtueMart
Re: Программа на c++ - .configure не находит hash_map
« Ответ #4 : 28 Октября 2010, 15:27:22 »
libstlport4.6-dev был установлен. Есть еще libstlport5.2-dev, но вряд ли это поможет. Проблема в том что файл есть, а configure говорит что его нет. Может, какие-то пути надо установить, но понятия не имею, где - я с C/C++ почти не знаком
« Последнее редактирование: 28 Октября 2010, 15:34:13 от qjmann »

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Программа на c++ - .configure не находит hash_map
« Ответ #5 : 28 Октября 2010, 15:49:15 »
Попробуй установить более старый g++. Лучше 4.1 по крайней в репах 10.04 он ещё есть. На форуме у этого проекта написанно, что он не любит новые версии g++. Просто они используют нестандартный хедер (hash_map и hash_set).

Я попробовал собрать эту прогу g++ 4.4 она сказала то же самое. Даунгрейдить компилятор не пробовал.

Ещё я попробовал следующее:
vidyuk@peti-laptop:~/Downloads/aspseek-1.2.10$ if c++ -E test.cpp 1>/dev/null; then echo "ok"; else echo "failed"; fi
In file included from /usr/include/c++/4.4/ext/hash_map:60,
                 from test.cpp:2:
/usr/include/c++/4.4/backward/backward_warning.h:28:2: warning: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date. Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h. To disable this warning use -Wno-deprecated.
ok
откуда видим что код завершения теста нормальный, а autoconf что-то не переваривает. Такое ощущение, что после запуска теста:
Цитировать
configure:5833: c++ -E  conftest.C >/dev/null 2>conftest.out
делается проверка на наличие чего бы то ни было внутри файла conftest.out. Таким образом ворнинг интерпретируется как ошибка.

Постить фрагмент configure достаточно гиблое дело. Этот скрипт был сгенерён из configure.in и результат почти не читабелен.

А вот сама проверка которая падает:
hash_in_ext=no
AC_CHECK_HEADERS(hash_map hash_set,, [
 AC_CHECK_HEADERS(ext/hash_map ext/hash_set,
  hash_in_ext=yes,
  AC_MSG_ERROR([** ERROR: Your system lacks some needed STL header files.])
)
]
break
)
Вопрос к людям знающим autoconf как доходчего объяснить этой системе, что падать нужно только при ошибке компиляции, а не при наличии warning'ов? Или как скормить -Wno-deprecated скрипту configure чтобы он передавал этот ключ компилятору при сборке тестов?

P.S. Не люблю autotools.
« Последнее редактирование: 28 Октября 2010, 18:02:16 от VestniK »

Оффлайн qjmann

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
    • Плагины и модули для ShopCMS, Joomla, VirtueMart
Re: Программа на c++ - .configure не находит hash_map
« Ответ #6 : 28 Октября 2010, 17:56:35 »
Большое спасибо за все советы, буду пробовать обойти ошибку.

Пользователь решил продолжить мысль 28 Октября 2010, 18:20:13:
Даунгрейдить компилятор не хочется - программу планирую устанавливать на разных серверах, на каждом даунгрейдить сложно. Я попробовал в файлах /usr/include/c++/4.4/ext/hash_map /usr/include/c++/4.4/ext/hash_set закомментировать строку, которая принудительно показывает эти варнинги:
//#include "backward_warning.h"Не знаю, хорошо ли я сделал, но теперь ./configure прошло без ошибок, зато make остановилась на ошибке:
Making all in src
make[1]: Вход в каталог `/home/user/crawlers/aspseek-1.2.10/src'
Making all in mysql
make[2]: Вход в каталог `/home/user/crawlers/aspseek-1.2.10/src/mysql'
/bin/sh ../../libtool --mode=compile c++ -DHAVE_CONFIG_H -I. -I. -I../../include -I../../include -I/usr/include/mysql    -g -O2 -D_REENTRANT -c mysqldb.cpp
c++ -DHAVE_CONFIG_H -I. -I. -I../../include -I../../include -I/usr/include/mysql -g -O2 -D_REENTRANT -c mysqldb.cpp  -fPIC -DPIC
In file included from ../../include/charsets.h:34,
                 from ../../include/ucharset.h:34,
                 from ../../include/sqldb.h:40,
                 from ../../include/mysqldb.h:30,
                 from mysqldb.cpp:26:
../../include/maps.h:38: error: 'std::hash_map' has not been declared
../../include/maps.h:39: error: 'std::hash_set' has not been declared
../../include/maps.h:42: error: 'hash' is not a template
../../include/maps.h: In member function 'size_t std::hash::operator()(const std::string&) const':
../../include/maps.h:45: error: '__stl_hash_string' was not declared in this scope
../../include/maps.h: At global scope:
../../include/maps.h:50: error: expected initializer before '<' token
../../include/maps.h:51: error: expected initializer before '<' token
../../include/maps.h:52: error: expected initializer before '<' token
In file included from ../../include/ucharset.h:34,
                 from ../../include/sqldb.h:40,
                 from ../../include/mysqldb.h:30,
                 from mysqldb.cpp:26:
../../include/charsets.h:38: error: 'std::hash_map' has not been declared
../../include/charsets.h:118: error: 'hash' is not a template
../../include/charsets.h:118: error: redefinition of 'struct std::hash'
../../include/maps.h:42: error: previous definition of 'struct std::hash'
../../include/charsets.h:188: error: expected template-name before '<' token
../../include/charsets.h:188: error: expected '{' before '<' token
../../include/charsets.h:188: error: expected unqualified-id before '<' token
../../include/charsets.h:209: error: expected template-name before '<' token
../../include/charsets.h:209: error: expected '{' before '<' token
../../include/charsets.h:209: error: expected unqualified-id before '<' token
make[2]: *** [mysqldb.lo] Ошибка 1
make[2]: Выход из каталога `/home/user/crawlers/aspseek-1.2.10/src/mysql'
make[1]: *** [all-recursive] Ошибка 1
make[1]: Выход из каталога `/home/user/crawlers/aspseek-1.2.10/src'
make: *** [all-recursive] Ошибка 1
[4]-  Готово            gedit /tmp/make
Не совсем понимаю - то ли синтаксическая ошибка, то ли что-то другое
« Последнее редактирование: 28 Октября 2010, 18:20:13 от qjmann »

Оффлайн Vorgehen

  • Любитель
  • *
  • Сообщений: 84
    • Просмотр профиля
Re: Программа на c++ - .configure не находит hash_map
« Ответ #7 : 28 Октября 2010, 18:54:10 »
Попробуй из-под
sudo su

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Программа на c++ - .configure не находит hash_map
« Ответ #8 : 28 Октября 2010, 19:19:24 »
Комментировать это в хедерах идущих с компилятором не правильно. Зачем же портить систему из за одной глючно написанной проги? Я пробовал к ним в багтрекер залезть поискать твою проблему но там мне сказали HTTP 404. По идее это нужно им зарепортить. Хотя на форуме у них это уже обсуждалось.

Цитировать
../../include/maps.h:38: error: 'std::hash_map' has not been declared
http://gcc.gnu.org/gcc-4.3/changes.html
Вообще судя по всему что есть в гугле должно быть __gnu_cxx::hash_set.

Учитывая что на их форуме спокойно живут спам боты (откровенно спамерские сообщения запощенные больше года назад), а так же на 404 вместо багтрекера сдаётся мне, что проект мёртв.

Попробуй из-под
sudo su
И как это хотя бы теоретически может помочь??? Вы в своём уме или просто нулевые знания о том что такое sudo и для чего он нужен? Готов публично извениться за грубый тон, если мне будет предоставлено внятное объяснение того, зачем для компиляции исходного кода на C++ компилятору могут понадобиться привелегии суперпользователя!

Оффлайн Vorgehen

  • Любитель
  • *
  • Сообщений: 84
    • Просмотр профиля
Re: Программа на c++ - .configure не находит hash_map
« Ответ #9 : 28 Октября 2010, 19:37:41 »
Вчера с logserial пробовал.Она у меня только из под root собралась.
Вот Makefile мной подправленный.
(Нажмите, чтобы показать/скрыть)
Вот первый файл
(Нажмите, чтобы показать/скрыть)
Из которого формируется logserial.o
(Нажмите, чтобы показать/скрыть)
вот второй из которого формируется sysdep1.o объектный файл.
При запуске мэйка вышли ошибки и варнинги.
Когда я зашёл как суперюзер всё прекрасно собралось и сегодня проверю на работоспособность.

Пользователь решил продолжить мысль 28 Октября 2010, 19:39:14:
в мэйк файле ещё ключ -m486 был,я его удалил.
« Последнее редактирование: 28 Октября 2010, 19:39:14 от Vorgehen »

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Программа на c++ - .configure не находит hash_map
« Ответ #10 : 28 Октября 2010, 19:39:19 »
Я любопытства ради попробовал поставить g++ 4.1 и собрать с ним. configure отрабатывает, но сборка выдаёт ту же ошибку.

vidyuk@peti-laptop:~/Downloads/aspseek-1.2.10$ sudo aptitude install g++-4.1
vidyuk@peti-laptop:~/Downloads/aspseek-1.2.10$ export CC=gcc-4.1
vidyuk@peti-laptop:~/Downloads/aspseek-1.2.10$ export CXX=gxx-4.1
vidyuk@peti-laptop:~/Downloads/aspseek-1.2.10$ ./configure
vidyuk@peti-laptop:~/Downloads/aspseek-1.2.10$ make
Making all in src
make[1]: Entering directory `/home/vidyuk/Downloads/aspseek-1.2.10/src'
Making all in mysql
make[2]: Entering directory `/home/vidyuk/Downloads/aspseek-1.2.10/src/mysql'
/bin/ksh ../../libtool --mode=compile g++-4.1 -DHAVE_CONFIG_H -I. -I. -I../../include -I../../include -I/usr/include/mysql    -g -O2 -D_REENTRANT -c mysqldb.cpp
g++-4.1 -DHAVE_CONFIG_H -I. -I. -I../../include -I../../include -I/usr/include/mysql -g -O2 -D_REENTRANT -c mysqldb.cpp  -fPIC -DPIC
../../include/maps.h:38: error: 'std::hash_map' has not been declared
../../include/maps.h:39: error: 'std::hash_set' has not been declared
...

Пользователь решил продолжить мысль 28 Октября 2010, 07:48:33:
Цитировать
Вчера с logserial пробовал.Она у меня только из под root собралась.
Интересно посмотреть на эти ошибки. Не существует объективной причины по которой компилятору нужны рутовые права. Если у пользователя нет прав на чтение файлов с исходниками, или нет прав на запись в директорию где создаются промежуточные или окончательные результаты сборки, то нужно менять права на файлы или копировать к себе в домашний каталог и собирать там. sudo make это безграмотность которая может привести к дестабилизации системы в случае криво написанных скриптов сборки.
all:
        $(RM) -r /
скажет Permission denied. Тот кто тупо сделает sudo make получит незабываемый опыт на всю жизнь. Внимание приведённый код Makefile уничтожает все данные на всех примонтированных дисках даже не думайте экспериментировать с ним
« Последнее редактирование: 28 Октября 2010, 19:56:15 от VestniK »

Оффлайн qjmann

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
    • Плагины и модули для ShopCMS, Joomla, VirtueMart
Re: Программа на c++ - .configure не находит hash_map
« Ответ #11 : 28 Октября 2010, 20:44:11 »
Да, проект умер.
Я заменил в std::hash_map и прочих std на __gnu_cxx, затем поправил (пользуясь гуглом) еще штук 100 самых разных ошибок компилирования, но кажется их там еще миллион - появляются новые и новые :) И неизвестно, как прога будет работать, если ее все-таки удастся откомпировать - так что наверное поищу какой-то аналог из живых проектов.

Оффлайн Sova777

  • Участник
  • *
  • Сообщений: 208
    • Просмотр профиля
    • Несколько слов о NetBeans C/C++ Pack'е
Re: Программа на c++ - .configure не находит hash_map
« Ответ #12 : 28 Октября 2010, 21:07:18 »
http://gcc.gnu.org/gcc-4.3/changes.html
Вообще судя по всему что есть в гугле должно быть __gnu_cxx::hash_set.
Похоже, что проект нужно собирать GCC2.X

Autotools тоже времён 2000-2002 года:
http://www.aspseek.org/cvs.php
To compile sources from CVS, you need autoconf, automake and libtool utilities. Note that autoconf should be of version 2.13; autoconf 2.50 will not work. The first step after checking out sources is to run ./cvsprep script, this will re-create all autogenerated files.
« Последнее редактирование: 28 Октября 2010, 21:32:18 от Sova777 »
Пользователь OpenSolaris 2008.11, Ubuntu 8.10, Windows XP. Mac OS X не нравится, стараюсь не использовать.

 

Страница сгенерирована за 0.025 секунд. Запросов: 22.