поиск:
Полезные ссылки

  • Форум по MySQL

  • Статьи по MySQL

  • Вопросы по MySQL

  • MySQL.com


  • Базы данных

  • MySQL

  • PostgreSQL


  • PHP конференция 2005
    Подробности!

    2.3.5. Проблемы с компиляцией?

    На Solaris или Linux с использованием компилятора gcc все программы MySQL у нас компилируются чисто и без каких-либо предупреждений. В других системах могут возникать предупреждения из-за различий включаемых системных файлов (по поводу предупреждений, которые могут возникать при использовании потоков MIT-pthreads, обращайтесь к разделу see Раздел 2.3.6, «Замечания по потокам MIT-pthreads»). Относительно других проблем сверьтесь с приведенным ниже списком.

    Решение многих проблем предполагает выполнение переконфигурирования. В случаях, когда переконфигурирование действительно необходимо, следует учитывать следующее:

    • Если configure запускается после того, как эта команда уже запускалась, то можно использовать информацию, которая была собрана во время предыдущего вызова команды (такая информация хранится в config.cache). При запуске configure ищет данный файл и, если он существует, читает его содержимое, исходя из предположения, что данная информация все еще правильна. При выполнении переконфигурации это предположение является некорректным.

    • Каждый раз при запуске configure необходимо опять запускать make для перекомпилирования. Однако, возможно, вначале вам потребуется удалить старые объектные файлы из предыдущих компоновок, поскольку они были скомпилированы с использованием других опций конфигурации.

      Чтобы не допустить использования старой конфигурационной информации или объектных файлов, перед перезапуском configure запустите следующие команды:

      shell> rm config.cache
      shell> make clean
      

      В качестве альтернативного варианта можно использовать команду make distclean.

      В следующем списке представлены некоторые проблемы компилирования MySQL, которые, как оказалось, возникают наиболее часто:

    • Если при компиляции sql_yacc.cc вы получаете ошибки, подобные представленным ниже, то, возможно, произошел выход за пределы памяти или пространства подкачки (свопинга):

      Internal compiler error: program cc1plus got fatal signal 11
      или
      Out of virtual memory
      или
      Virtual memory exhausted
      

      Проблема заключается в том, что для компиляции sql_yacc.cc со встраиваемыми функциями компилятору gcc требуется значительное количество памяти. Попробуйте произвести запуск configure с опцией --with-low-memory:

      shell> ./configure --with-low-memory
      

      Данная опция вызывает добавление -fno-inline к компилируемой строке для gcc и -O0 - при использовании какого-либо другого компилятора. Даже если у вас столько памяти и пространства для свопинга, что, по вашему мнению, невозможно выйти за их пределы, все же стоит попытаться использовать опцию with-low-memory. Эта проблема, по нашим наблюдениям, возникала даже на системах с аппаратными реализациями, обладающими широкими возможностями; обычно она устраняется с помощью опции --with-low-memory.

    • По умолчанию configure выбирает c++ как имя компилятора и GNU c++ линкуется с -lg++. При использовании gcc этот режим работы может вызывать такие проблемы в процессе конфигурации, как:

      configure: error: installation or configuration problem:
      C++ compiler cannot create executables.
      

      Во время компиляции могут также возникать проблемы, относящиеся к g++, libg++ или libstdc++. Одна из причин их возникновения заключается в том, что, возможно, у вас нет g++ или есть g++, но нет библиотеки libg++ или libstdc++. Следует изучить файл config.log - по нему вы должны точно определить причину, по которой не работал компилятор c++ ! Чтобы обойти эти проблемы, можно в качестве компилятора C++ использовать gcc. Попробуйте установить переменную окружения CXX в gcc -O3. Например:

      shell> CXX="gcc -O3" ./configure
      

      Эта команда работает, поскольку gcc компилирует исходные коды C++ так же хорошо, как и g++, но по умолчанию не линкует libg++ или libstdc++. Есть, конечно, и другая возможность устранения этих проблем, которая заключается в установке g++, libg++ и libstdc++. Однако мы не рекомендовали бы использовать libg++ или libstdc++ с MySQL, поскольку это только увеличит размер бинарного кода mysqld без предоставления каких-либо преимуществ. Некоторые версии этих библиотек в прошлом также вызывали непонятные проблемы у пользователей MySQL.

    • Если процесс компиляции завершается аварийно и выводятся такие ошибки, как приведены ниже, то вам следует сделать апгрейд своей версии make до GNU make:

      making all in mit-pthreads
      make: Fatal error in reader: Makefile, line 18:
      Badly formed macro assignment
      или
      make: file `Makefile' line 18: Must be a separator (:
      или
      pthread.h: No such file or directory
      

      Операционные системы Solaris и FreeBSD, как известно, имеют ненадежные программы make.

      Известно также, что версия GNU make 3.75 работает.

    • Если вы хотите определить флаги для использования их компиляторами C или C++, следует добавить флаги к переменным окружения CFLAGS и CXXFLAGS. Точно так же можно также указать имена компиляторов, используя CC и CXX. Например:

      shell> CC=gcc
      shell> CFLAGS=-O3
      shell> CXX=gcc
      shell> CXXFLAGS=-O3
      shell> export CC CFLAGS CXX CXXFLAGS
      

      В разделе Раздел 2.2.7, «Бинарные коды MySQL, скомпилированные в MySQL AB» приведен список полезных для различных систем определений флагов.

    • При получении сообщения об ошибке, подобного приведенному ниже, необходимо модернизировать ваш компилятор gcc:

      client/libmysql.c:273: parse error before `__attribute__'
      

      Компилятор gcc 2.8.1 известен как работающий, но мы рекомендуем вместо него использовать gcc 2.95.2 или egcs 1.0.3a.

    • Если при компиляции mysqld вы получаете ошибки, подобные приведенным ниже, то это означает, что команда configure некорректно определила тип последнего аргумента в функциях accept(), getsockname() или getpeername():

      cxx: Error: mysqld.cc, line 645: In this statement, the referenced
      type of the pointer value "&length" is "unsigned long", which
      is not compatible with "int".
      new_sock = accept(sock, (struct sockaddr *)&cAddr, &length);
      

      Чтобы устранить эту ошибку, отредактируйте файл config.h (который генерируется configure). Найдите в нем следующие строки:

      /* Define as the base type of the last arg to accept */
      #define SOCKET_SIZE_TYPE XXX
      

      и измените XXX на size_t или int - в зависимости от своей операционной системы (учтите, что эти действия необходимо будет повторять каждый раз при запуске configure, поскольку configure восстанавливает файл config.h).

    • Файл sql_yacc.cc генерируется из sql_yacc.yy. Обычно в процессе сборки не требуется создавать sql_yacc.cc, поскольку MySQL поставляется с уже сгенерированной копией. Однако если действительно необходимо создать этот файл заново, то можно столкнуться со следующей ошибкой:

      "sql_yacc.yy", line xxx fatal: default action causes potential...
      

      Это признак того, что ваша версия yacc является неполной. Возможно, следует установить bison (GNU-версия yacc) и использовать вместо yacc.

    • При необходимости отладки mysqld или клиента MySQL запустите configure с опцией --with-debug, затем перекомпилируйте и слинкуйте эти программы с новой клиентской библиотекой (see Раздел D.2, «Отладка клиента MySQL»).

     
    © 1997-2005 PHP Club Team
    Rambler's Top100